/*
 Copyright (C) 2010 Kristian Duske

 This file is part of TrenchBroom.

 TrenchBroom is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 TrenchBroom is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with TrenchBroom. If not, see <http://www.gnu.org/licenses/>.
 */

#include "Matchers.h"
#include "fs/DiskIO.h"
#include "fs/DkPakFileSystem.h"
#include "fs/IdPakFileSystem.h"
#include "fs/PathInfo.h"
#include "fs/TestUtils.h"
#include "fs/TraversalMode.h"
#include "fs/WadFileSystem.h"
#include "fs/ZipFileSystem.h"

#include <filesystem>

#include <catch2/catch_test_macros.hpp>
#include <catch2/generators/catch_generators.hpp>

namespace tb::fs
{

const auto cr8_czg_03_contents = std::vector<unsigned char>{
  0x63, 0x72, 0x38, 0x5F, 0x63, 0x7A, 0x67, 0x5F, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
  0x28, 0x20, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x28, 0x2A, 0x00, 0x00, 0x31, 0xAC,
  0xAD, 0x8D, 0xAE, 0x8F, 0xAE, 0x11, 0x12, 0x8C, 0xAE, 0x13, 0x8D, 0x8C, 0x8B, 0x8D,
  0x8D, 0x8D, 0x12, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x10, 0x10, 0x8F,
  0x10, 0x8F, 0x8F, 0x8F, 0x8F, 0x8E, 0x8F, 0x10, 0x11, 0x8E, 0x8E, 0x10, 0x10, 0x8E,
  0x11, 0x12, 0x13, 0x14, 0x8C, 0x14, 0x14, 0x12, 0x12, 0xAE, 0xAE, 0xAE, 0x13, 0x60,
  0x13, 0x13, 0x14, 0x16, 0x17, 0x70, 0x31, 0x8C, 0x8D, 0xAE, 0x8F, 0x10, 0x11, 0xAD,
  0x14, 0x8D, 0xAE, 0x8D, 0x8D, 0xAD, 0x13, 0x8C, 0x8D, 0x13, 0x12, 0x10, 0x8F, 0x10,
  0x10, 0x8E, 0x10, 0x8F, 0x8E, 0x10, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x8E, 0x8F,
  0x10, 0x10, 0x10, 0x8E, 0x8E, 0x8F, 0x8F, 0x31, 0x10, 0x12, 0x13, 0x8C, 0x14, 0x8B,
  0x14, 0x12, 0x12, 0xAE, 0x12, 0x13, 0x72, 0x13, 0xAD, 0x13, 0x14, 0x15, 0x17, 0x70,
  0x40, 0x8C, 0x11, 0x13, 0x11, 0x8F, 0x11, 0xAE, 0x14, 0x8C, 0x8D, 0x8D, 0x11, 0x12,
  0xAD, 0x8C, 0xAE, 0x8D, 0xAE, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x8F, 0x8E, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x8F,
  0x8F, 0x31, 0x32, 0x71, 0x14, 0x14, 0x14, 0x9C, 0x13, 0x12, 0x12, 0x11, 0x11, 0xAE,
  0x13, 0x12, 0xAD, 0x13, 0x14, 0x14, 0x17, 0x31, 0x31, 0x12, 0x8E, 0x13, 0x8D, 0xAE,
  0x11, 0xAE, 0x8D, 0x13, 0x11, 0xAE, 0x8D, 0x8C, 0x13, 0x14, 0x8C, 0x8D, 0xAE, 0x10,
  0x10, 0x8F, 0x8E, 0x8E, 0x31, 0x10, 0x8E, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x11, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x10, 0x31, 0x8F, 0x8F, 0x10, 0x8D, 0x14, 0x13,
  0x14, 0x15, 0x15, 0x72, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x15,
  0x9A, 0x70, 0x31, 0x16, 0x13, 0x9C, 0xAE, 0x8D, 0xAE, 0x11, 0xAE, 0xAE, 0x13, 0x13,
  0xAE, 0x8C, 0x8B, 0xAD, 0x8D, 0x8D, 0x8D, 0x10, 0x10, 0x11, 0x8E, 0x10, 0x8F, 0x8F,
  0x8F, 0x8E, 0x10, 0x10, 0x8E, 0x8F, 0x10, 0x8F, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x8F, 0x8F, 0x70, 0x10, 0x60, 0x13, 0x13, 0x72, 0x14, 0x15, 0x72, 0x13, 0x13,
  0x13, 0x13, 0x12, 0x13, 0xAD, 0x13, 0x13, 0x14, 0x9A, 0x31, 0x31, 0x16, 0x9B, 0x9C,
  0x14, 0x11, 0xAE, 0x13, 0x13, 0x8D, 0x12, 0x13, 0x12, 0x13, 0x8B, 0x8C, 0x8C, 0x8D,
  0xAE, 0x8E, 0x8F, 0x8E, 0x8E, 0x8E, 0x10, 0x8F, 0x8F, 0x8E, 0x8E, 0x8F, 0x8F, 0x10,
  0x8F, 0x10, 0x8F, 0x8F, 0x10, 0x8F, 0x8F, 0x10, 0x8F, 0x8F, 0x8F, 0x10, 0x10, 0x12,
  0x13, 0x13, 0x14, 0x15, 0x15, 0x72, 0x13, 0x13, 0x12, 0x12, 0x13, 0x11, 0x13, 0xAE,
  0x8C, 0x8D, 0x14, 0x31, 0x8F, 0x75, 0x9B, 0x8B, 0x8C, 0x8E, 0x13, 0x8D, 0x8D, 0x12,
  0x8D, 0x8D, 0x12, 0xAD, 0x13, 0x8D, 0xAE, 0x13, 0xAE, 0x8E, 0x8F, 0x11, 0x10, 0x10,
  0x10, 0x8F, 0x8F, 0x8F, 0x11, 0x8E, 0x10, 0x10, 0x11, 0x10, 0x10, 0x10, 0x11, 0x8E,
  0x11, 0x8E, 0x11, 0x8F, 0x70, 0x10, 0x11, 0x12, 0x14, 0x14, 0x14, 0x14, 0x15, 0x13,
  0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0xAE, 0x11, 0x8D, 0xAD, 0xAC, 0x31, 0x31, 0xAC,
  0x14, 0xAD, 0x13, 0x8D, 0x13, 0x8E, 0x12, 0x12, 0x8D, 0x12, 0xAE, 0x14, 0x13, 0xAD,
  0xAE, 0xAE, 0xAE, 0x8E, 0x8F, 0x8E, 0x8E, 0x10, 0x8F, 0x31, 0x8F, 0x10, 0x10, 0x10,
  0x10, 0x11, 0x10, 0x8F, 0x70, 0x8F, 0x10, 0x11, 0x8E, 0x8E, 0x11, 0x8F, 0x10, 0x11,
  0x10, 0x12, 0x14, 0x15, 0x72, 0x14, 0x15, 0x72, 0x13, 0x13, 0x13, 0x13, 0x12, 0xAE,
  0x8D, 0x8D, 0x8C, 0x15, 0xAC, 0x31, 0x31, 0x14, 0xAD, 0x9C, 0x14, 0x13, 0x8D, 0x13,
  0x13, 0x11, 0x11, 0x11, 0xAE, 0x72, 0xAD, 0xAD, 0xAE, 0xAE, 0xAE, 0x10, 0x11, 0x10,
  0x10, 0x8E, 0x10, 0x31, 0x10, 0x10, 0x10, 0x11, 0x11, 0x8E, 0x11, 0x8E, 0x8E, 0x10,
  0x10, 0x8E, 0x8F, 0x8F, 0x8F, 0x11, 0x31, 0x8F, 0x11, 0x12, 0x14, 0x14, 0x14, 0xAC,
  0x15, 0x72, 0x13, 0x13, 0x13, 0x13, 0x13, 0x8D, 0xAD, 0x8D, 0x8C, 0x9C, 0xAC, 0x31,
  0x31, 0x14, 0xAD, 0x13, 0x13, 0x8D, 0x12, 0x12, 0x11, 0xAE, 0xAE, 0x8D, 0x8C, 0x15,
  0x13, 0x8E, 0x11, 0x8D, 0xAE, 0x8E, 0x10, 0x10, 0x8E, 0x10, 0x8F, 0x8F, 0x8F, 0x8F,
  0x8F, 0x8F, 0x8F, 0x11, 0x8E, 0x8E, 0x10, 0x8F, 0x8F, 0x31, 0x8F, 0x31, 0x11, 0x10,
  0x11, 0x31, 0x31, 0x11, 0x8F, 0x14, 0x14, 0x16, 0x15, 0x12, 0x13, 0xAE, 0x8D, 0xAE,
  0x13, 0xAD, 0x8D, 0xAE, 0x8C, 0x9C, 0xAC, 0x31, 0x31, 0x14, 0x13, 0x8D, 0xAE, 0x8D,
  0x8D, 0x8D, 0x13, 0x8D, 0xAE, 0x8D, 0x72, 0xAE, 0xAE, 0x11, 0x11, 0xAE, 0xAE, 0x8E,
  0x8E, 0x8F, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x8F, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x8E,
  0x8E, 0x11, 0x11, 0x12, 0x11, 0x10, 0x11, 0x10, 0x10, 0x8E, 0x8E, 0x13, 0x14, 0x8C,
  0x14, 0x14, 0x14, 0xAE, 0x12, 0x12, 0x13, 0x13, 0xAD, 0x12, 0x12, 0x8D, 0x14, 0x9C,
  0x9A, 0x70, 0x31, 0xAC, 0x8D, 0xAE, 0xAE, 0x13, 0x13, 0x11, 0xAD, 0x12, 0x8D, 0x8D,
  0x9C, 0x15, 0x74, 0x72, 0x14, 0xAE, 0xAE, 0x10, 0x8F, 0x10, 0x8F, 0x10, 0x8F, 0x8F,
  0x31, 0x10, 0x8E, 0x8F, 0x11, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x8F, 0x11, 0x11, 0x12,
  0x11, 0x11, 0x12, 0x8E, 0x8E, 0x12, 0x8C, 0x13, 0x8C, 0x8D, 0x15, 0x12, 0x13, 0x12,
  0x12, 0x12, 0x12, 0x12, 0x12, 0xAE, 0x8C, 0x15, 0x16, 0x70, 0x31, 0xAC, 0xAD, 0x8D,
  0x8D, 0x8D, 0x11, 0x13, 0x12, 0x12, 0x8D, 0x13, 0x13, 0x14, 0xAA, 0xAC, 0x14, 0x72,
  0xAE, 0x8E, 0x8F, 0x8F, 0x8F, 0x10, 0x31, 0x31, 0x8F, 0x8F, 0x10, 0x8F, 0x8E, 0x8F,
  0x10, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x8E, 0x12, 0xAE, 0x12,
  0xAE, 0x8D, 0x8C, 0x8D, 0x15, 0x72, 0x12, 0xAE, 0x12, 0x13, 0x12, 0x12, 0xAE, 0x8D,
  0x8C, 0x14, 0xAC, 0x31, 0x31, 0x14, 0x8D, 0x8D, 0xAE, 0x8D, 0x11, 0x8D, 0x8D, 0x8D,
  0x8D, 0x8C, 0x13, 0x14, 0xAA, 0x15, 0x15, 0x8D, 0xAE, 0x10, 0x10, 0x8F, 0x10, 0x11,
  0x11, 0x8F, 0x8E, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x10, 0x11,
  0x11, 0x12, 0x11, 0x8D, 0x12, 0x13, 0x12, 0x12, 0x8D, 0x8D, 0xAE, 0xAD, 0x15, 0xAE,
  0x13, 0x13, 0x8D, 0x11, 0x12, 0x8D, 0x12, 0x8D, 0x13, 0xAD, 0x16, 0x31, 0x31, 0x14,
  0x13, 0x8D, 0x8D, 0x8D, 0x72, 0x12, 0xAE, 0xAE, 0xAE, 0xAE, 0x8D, 0xAD, 0x74, 0x15,
  0x8C, 0x8D, 0x8D, 0x10, 0x10, 0x8F, 0x8E, 0x10, 0x10, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F,
  0x8F, 0x10, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x31, 0x31, 0x12, 0x31, 0x12, 0x8E,
  0xAE, 0x12, 0x8D, 0x8C, 0x8C, 0xAD, 0xAD, 0x8D, 0x13, 0xAE, 0xAE, 0xAE, 0x11, 0xAE,
  0x11, 0x11, 0xAE, 0xAD, 0x16, 0x31, 0x31, 0x8C, 0x13, 0xAE, 0xAE, 0xAE, 0x11, 0x11,
  0x11, 0xAE, 0x11, 0xAE, 0xAE, 0x15, 0x16, 0x14, 0x8C, 0xAE, 0x11, 0x8E, 0x10, 0x8F,
  0x10, 0x11, 0x10, 0x11, 0x8E, 0x8F, 0x8F, 0x10, 0x8F, 0x8F, 0x8F, 0x10, 0x10, 0x10,
  0x11, 0x10, 0x11, 0x11, 0x12, 0x11, 0x8E, 0x11, 0x11, 0x13, 0x8C, 0xAE, 0x8C, 0xAD,
  0xAD, 0x8D, 0xAD, 0x11, 0xAE, 0x13, 0xAE, 0xAE, 0xAE, 0xAE, 0x8D, 0x9C, 0x17, 0x10,
  0x10, 0x14, 0xAD, 0x9C, 0xAE, 0x14, 0xAE, 0xAE, 0xAE, 0xAE, 0x11, 0xAE, 0xAE, 0xAD,
  0xAD, 0x72, 0x8C, 0xAE, 0xAE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x8F,
  0x10, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x8E, 0x11, 0x11, 0x8E,
  0x10, 0x8E, 0x8F, 0x12, 0x8D, 0xAE, 0x8C, 0x8B, 0x8B, 0xAE, 0x12, 0xAD, 0xAD, 0x8D,
  0xAD, 0xAE, 0x11, 0xAE, 0x8D, 0x14, 0x17, 0x31, 0x8F, 0x75, 0x9B, 0xAD, 0xAE, 0x12,
  0x8D, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x8D, 0xAD, 0x13, 0x8D, 0x8C, 0x8D, 0xAE, 0x11,
  0x11, 0x8F, 0x11, 0x10, 0xAE, 0x11, 0x10, 0x10, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x8F,
  0x8E, 0x10, 0x10, 0x8E, 0x12, 0x12, 0x11, 0x8F, 0x10, 0x11, 0x11, 0x11, 0x14, 0x14,
  0x8D, 0x8D, 0x8B, 0xAD, 0xAD, 0xAD, 0xAD, 0xAE, 0xAE, 0x8D, 0x11, 0xAD, 0x8D, 0x15,
  0x9A, 0x31, 0x31, 0xAC, 0x9B, 0x9C, 0x13, 0x12, 0x8D, 0x13, 0xAE, 0x11, 0x8D, 0x11,
  0x8D, 0xAD, 0x8B, 0x8D, 0x8D, 0x8D, 0x12, 0x11, 0x11, 0x11, 0x8E, 0x11, 0x10, 0x8E,
  0x10, 0x11, 0x11, 0x10, 0x8E, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x8D, 0x10, 0x13, 0x12,
  0x10, 0x10, 0x11, 0x11, 0xAE, 0x12, 0x8C, 0x8C, 0x8C, 0xAD, 0x8B, 0x8D, 0x13, 0xAE,
  0xAE, 0xAD, 0xAD, 0xAD, 0x8B, 0xAD, 0x8C, 0xAB, 0xAA, 0x10, 0x10, 0x75, 0x14, 0x8C,
  0x13, 0x13, 0x13, 0x8D, 0xAE, 0x11, 0x8D, 0xAE, 0x14, 0x8C, 0xAD, 0xAD, 0xAE, 0x12,
  0x12, 0x11, 0x11, 0x8F, 0x11, 0x11, 0x10, 0x8F, 0x10, 0x8E, 0x10, 0x11, 0x8E, 0x8E,
  0x8E, 0x8F, 0x10, 0x8F, 0x11, 0x10, 0x8E, 0x11, 0x12, 0x12, 0x11, 0x11, 0x10, 0x8D,
  0x8D, 0x8C, 0x8D, 0xAD, 0xAD, 0x8D, 0xAE, 0x12, 0x13, 0x13, 0x72, 0xAD, 0x13, 0xAE,
  0xAC, 0x9C, 0x9A, 0x70, 0x10, 0x75, 0x8B, 0x13, 0x12, 0x12, 0x13, 0x13, 0x11, 0x8F,
  0x71, 0x12, 0x14, 0x8C, 0x15, 0xAD, 0x8D, 0x8D, 0x12, 0x11, 0x11, 0x10, 0x11, 0x11,
  0x11, 0x10, 0x8E, 0x10, 0x10, 0x11, 0x8E, 0x10, 0x8F, 0x8F, 0x8F, 0x8F, 0x11, 0x11,
  0x11, 0x11, 0x11, 0x8F, 0x8E, 0x8E, 0x10, 0xAE, 0x8C, 0xAE, 0x8D, 0x8B, 0xAD, 0x8D,
  0x11, 0x8D, 0x12, 0x13, 0x14, 0xAC, 0x14, 0x8C, 0x8B, 0x14, 0xAA, 0x10, 0x8F, 0x75,
  0x8B, 0x72, 0x13, 0x11, 0x13, 0x13, 0x13, 0x12, 0x10, 0x12, 0x13, 0x14, 0xAD, 0x12,
  0x8D, 0x13, 0x12, 0x11, 0x10, 0x11, 0x11, 0x11, 0x11, 0x8E, 0x10, 0x10, 0x11, 0x10,
  0x8E, 0x10, 0x10, 0x10, 0x11, 0x11, 0x12, 0x11, 0x11, 0x11, 0x10, 0x10, 0x8E, 0x10,
  0x10, 0x11, 0x8C, 0x8D, 0xAC, 0x8D, 0xAD, 0x8D, 0xAE, 0x8D, 0x13, 0x9A, 0x9B, 0xAC,
  0x14, 0x72, 0xAC, 0xAC, 0x17, 0x70, 0x8F, 0x99, 0x9B, 0x8D, 0x12, 0x12, 0x16, 0x18,
  0x17, 0xAE, 0x60, 0x10, 0xAE, 0x8C, 0x8B, 0x14, 0xAD, 0x13, 0x13, 0xAE, 0x11, 0x11,
  0x11, 0x11, 0x11, 0x8F, 0x8E, 0x11, 0x12, 0x11, 0x10, 0x11, 0x10, 0x31, 0x10, 0x10,
  0x11, 0x11, 0x11, 0x11, 0x8E, 0x8E, 0x8F, 0x8F, 0x8E, 0x8D, 0x8C, 0xAE, 0x8D, 0xAD,
  0x8B, 0x13, 0xAE, 0x12, 0x67, 0x79, 0x89, 0x8A, 0x14, 0x8D, 0x15, 0x14, 0x9A, 0x70,
  0x10, 0x99, 0xAB, 0x8D, 0x12, 0x13, 0x78, 0x79, 0xAC, 0x8C, 0x13, 0x11, 0xAE, 0x14,
  0x8B, 0x13, 0x13, 0x8D, 0x8D, 0x8E, 0x10, 0x8E, 0x10, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E,
  0x8E, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x8E, 0x11, 0x12, 0x12, 0x11, 0x8F, 0x8E,
  0x10, 0x11, 0x10, 0x11, 0x8C, 0x8D, 0x8D, 0x9C, 0x8B, 0xAE, 0xAE, 0x13, 0x89, 0x8D,
  0xAE, 0x02, 0xAD, 0x13, 0x14, 0x14, 0x17, 0x70, 0x31, 0xAC, 0x14, 0x13, 0x11, 0xAC,
  0xAA, 0x11, 0x11, 0xAE, 0x02, 0x11, 0x11, 0x13, 0x8B, 0x14, 0x13, 0x8D, 0x8D, 0x8E,
  0x8E, 0x8E, 0x8E, 0x10, 0x10, 0x8F, 0x8E, 0x8E, 0x8E, 0xAE, 0x11, 0x11, 0x8F, 0x10,
  0x8F, 0x10, 0x8E, 0x10, 0x11, 0x12, 0x8E, 0x8E, 0x8E, 0x10, 0x10, 0x8D, 0x14, 0x14,
  0x8D, 0x9C, 0xAD, 0x8D, 0x8E, 0xAE, 0xAD, 0x01, 0x01, 0x20, 0x02, 0x11, 0xAD, 0x16,
  0xAC, 0x31, 0x70, 0x18, 0x16, 0x8D, 0x8D, 0xAD, 0xAD, 0x11, 0x01, 0x20, 0x02, 0x11,
  0x11, 0xAD, 0x14, 0x9C, 0x8D, 0x8D, 0xAE, 0xAE, 0x10, 0x8E, 0x8E, 0x10, 0x8F, 0x10,
  0x10, 0x10, 0x8E, 0x11, 0x11, 0x11, 0x11, 0x8F, 0x10, 0x12, 0x12, 0x8E, 0x10, 0x10,
  0x11, 0x10, 0x10, 0x10, 0x8E, 0x8D, 0x8C, 0x14, 0x14, 0x14, 0x8B, 0xAE, 0x11, 0xAE,
  0x02, 0xAE, 0x20, 0x02, 0x21, 0x11, 0x14, 0x16, 0x75, 0x70, 0x70, 0x19, 0x16, 0x14,
  0x13, 0x12, 0x02, 0x01, 0x20, 0x02, 0x21, 0x10, 0xAE, 0x72, 0x14, 0x8C, 0x8D, 0x8D,
  0x8D, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, 0x10, 0x10, 0x8E, 0x8E, 0x11, 0x11, 0x11, 0x11,
  0x8F, 0x11, 0x10, 0x12, 0x11, 0x8F, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x8E, 0x11,
  0x14, 0x13, 0x72, 0xAC, 0xAC, 0xAE, 0xAE, 0x8E, 0x11, 0x02, 0x02, 0x21, 0xAE, 0xAC,
  0xAC, 0x16, 0x18, 0x70, 0x10, 0x19, 0x74, 0xAC, 0xAE, 0x12, 0x11, 0x02, 0x02, 0x01,
  0x11, 0x11, 0x8D, 0x8C, 0x8B, 0x8D, 0xAE, 0x8D, 0xAE, 0x8E, 0x10, 0x8F, 0x8F, 0x10,
  0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x8E, 0x11, 0x10, 0x8E, 0x8F,
  0x10, 0x8E, 0x11, 0x11, 0x11, 0x10, 0x10, 0x12, 0x8C, 0x8D, 0x8C, 0x8B, 0x15, 0xAE,
  0x10, 0xAE, 0x11, 0x11, 0xAE, 0x8D, 0xAD, 0x13, 0x8B, 0x74, 0x18, 0x31, 0x70, 0x19,
  0x74, 0x14, 0x13, 0xAE, 0x12, 0xAE, 0x8E, 0x12, 0x11, 0x12, 0x12, 0x8C, 0x13, 0x8C,
  0x8C, 0xAE, 0xAE, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x11, 0x10, 0x10,
  0x10, 0x11, 0x8F, 0x11, 0x11, 0x10, 0x8F, 0x10, 0x8E, 0x10, 0x11, 0x10, 0x11, 0x10,
  0x10, 0xAD, 0x14, 0x14, 0x8C, 0x9C, 0x8B, 0xAE, 0xAE, 0x8D, 0x8C, 0x8D, 0xAE, 0xAE,
  0x13, 0x9C, 0x15, 0x16, 0x74, 0x31, 0x10, 0x76, 0x16, 0xAD, 0x13, 0x8B, 0x8D, 0x8D,
  0x8D, 0x12, 0x60, 0x10, 0x11, 0x8C, 0x8B, 0x8D, 0x8C, 0x8D, 0xAD, 0xAE, 0x11, 0x10,
  0x10, 0x8E, 0x11, 0x11, 0x8E, 0x8E, 0x10, 0x10, 0x10, 0x11, 0x10, 0x11, 0x11, 0x11,
  0x10, 0x8E, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x8E, 0xAD, 0x14, 0x13, 0x8C, 0x8D,
  0x8B, 0x8D, 0xAE, 0x13, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x13, 0x15, 0x75, 0x1B, 0x31,
  0x31, 0x18, 0xAA, 0xAD, 0x14, 0xAE, 0xAE, 0xAE, 0xAE, 0x8D, 0x13, 0x11, 0xAE, 0xAE,
  0xAD, 0x8D, 0x8C, 0x8D, 0x8D, 0x10, 0x8E, 0x10, 0x10, 0x8E, 0x11, 0x11, 0x11, 0x8E,
  0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x8E, 0x10, 0x10, 0x11, 0x10, 0x11,
  0x11, 0x8E, 0x10, 0x13, 0xAD, 0x13, 0x8C, 0x8D, 0x8B, 0xAE, 0xAE, 0x13, 0x72, 0xAE,
  0x8D, 0x13, 0xAE, 0xAE, 0x14, 0x16, 0x74, 0x70, 0x30, 0x17, 0x73, 0x13, 0x13, 0x72,
  0xAE, 0x8D, 0x13, 0x8D, 0x8D, 0x11, 0x11, 0x12, 0x13, 0x14, 0xAE, 0xAE, 0x8D, 0x8E,
  0x8E, 0x10, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11,
  0x11, 0x11, 0x8F, 0x8E, 0x11, 0x10, 0x10, 0x8F, 0x11, 0x8E, 0x10, 0x13, 0x13, 0x8C,
  0x8C, 0x8D, 0x13, 0x11, 0xAE, 0x8D, 0x13, 0x8D, 0xAE, 0xAD, 0x72, 0x12, 0x72, 0x9B,
  0x75, 0x31, 0x40, 0x16, 0xAD, 0x8D, 0x8D, 0x13, 0x8D, 0xAE, 0xAD, 0x13, 0x8D, 0x11,
  0x11, 0x14, 0x15, 0x72, 0xAE, 0x8D, 0x13, 0x8E, 0x10, 0x11, 0xAE, 0x11, 0x10, 0x8E,
  0x8F, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x8E, 0x8E, 0x8E, 0x8E, 0x11, 0x10,
  0x11, 0x10, 0x10, 0x10, 0x10, 0xAD, 0x8D, 0x8C, 0x8D, 0xAD, 0x13, 0x11, 0x11, 0x8D,
  0x11, 0x11, 0xAE, 0x14, 0x14, 0xAD, 0xAD, 0x73, 0x74, 0x31, 0x40, 0xAC, 0x14, 0x12,
  0xAD, 0x11, 0x11, 0xAE, 0x13, 0xAD, 0xAD, 0x10, 0x11, 0x8C, 0xAC, 0x8D, 0xAE, 0xAE,
  0x13, 0x11, 0x10, 0x8E, 0x11, 0x11, 0x11, 0x10, 0x11, 0x10, 0x10, 0x10, 0x8F, 0x10,
  0x10, 0x8E, 0x10, 0x10, 0x8F, 0x8E, 0x11, 0x11, 0x10, 0x10, 0x8E, 0x10, 0x8E, 0x11,
  0x8C, 0x8D, 0x8C, 0x8D, 0x13, 0x11, 0x11, 0x8D, 0x8D, 0x12, 0x12, 0x8D, 0x13, 0x13,
  0x14, 0xAC, 0xAA, 0x40, 0x40, 0x15, 0x13, 0xAD, 0x11, 0x13, 0x12, 0x8D, 0x13, 0xAD,
  0x12, 0xAE, 0x13, 0xAE, 0x8D, 0x8D, 0x8D, 0x8D, 0x12, 0x10, 0x10, 0x10, 0x10, 0x11,
  0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x11, 0x8E, 0x10, 0x8F, 0x10, 0x10, 0x8D, 0x8D, 0xAE, 0x8D, 0x8D, 0xAD, 0xAE,
  0xAE, 0x8E, 0x8D, 0x8D, 0x8D, 0x13, 0x13, 0xAC, 0xAC, 0xAB, 0x9A, 0x40, 0x70, 0x19,
  0x14, 0x13, 0xAD, 0x12, 0x13, 0xAE, 0xAE, 0x13, 0x12, 0xAD, 0x8D, 0x32, 0x8E, 0x8E,
  0x10, 0xAE, 0x8D, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x8E, 0x8E, 0x10, 0x10,
  0x11, 0xAD, 0x13, 0x8D, 0x8D, 0x8D, 0x13, 0xAE, 0x10, 0xAE, 0xAE, 0xAE, 0xAE, 0x13,
  0xAD, 0x13, 0x8B, 0xAC, 0x14, 0x31, 0x40, 0xAC, 0x15, 0xAC, 0x9C, 0x8D, 0xAD, 0x8D,
  0xAE, 0x8D, 0x8E, 0xAD, 0xAE, 0x8C, 0x8B, 0xAC, 0x14, 0x8D, 0x13, 0x11, 0x10, 0x11,
  0x10, 0x8E, 0x8E, 0x8E, 0x10, 0x10, 0x10, 0x11, 0x10, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F,
  0x10, 0x8E, 0x8E, 0x8E, 0x8E, 0x10, 0x11, 0x11, 0xAE, 0x12, 0x13, 0x8C, 0x8D, 0x8D,
  0xAB, 0x8D, 0x8D, 0x8D, 0xAE, 0x8E, 0xAE, 0x13, 0x11, 0x9C, 0xAC, 0xAC, 0x99, 0x31,
  0x70, 0xAB, 0xAB, 0xAC, 0x8D, 0xAE, 0x8C, 0x16, 0x8A, 0x8C, 0xAE, 0xAD, 0xAD, 0x8C,
  0x8B, 0xAC, 0x8C, 0x13, 0x8D, 0x10, 0x8E, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x8E, 0x10, 0x8E, 0x10, 0x10, 0x11, 0x11, 0x10,
  0x10, 0x11, 0x10, 0x11, 0x8C, 0x8D, 0x8C, 0x8D, 0xAD, 0xAE, 0xAE, 0x11, 0x12, 0x12,
  0x13, 0x8D, 0x8D, 0xAD, 0x8B, 0xAB, 0x99, 0x31, 0x31, 0xAC, 0xAC, 0x13, 0xAE, 0x8C,
  0x75, 0x68, 0xAC, 0x8B, 0x8D, 0x8D, 0xAD, 0xAC, 0xAC, 0x72, 0xAE, 0x8D, 0x13, 0xAE,
  0x10, 0x11, 0x12, 0x8E, 0x8E, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x8E,
  0x10, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x8E, 0x11, 0x8D, 0x8D,
  0x14, 0xAC, 0xAB, 0xAD, 0x11, 0xAE, 0x74, 0x64, 0x8A, 0xAC, 0x15, 0xAD, 0x13, 0xAC,
  0x99, 0x8F, 0x31, 0x15, 0x9C, 0x8D, 0x8D, 0x8C, 0x89, 0x11, 0xAE, 0xAE, 0xAD, 0xAE,
  0xAD, 0xAD, 0x15, 0x13, 0x8D, 0xAD, 0xAD, 0xAE, 0x11, 0x11, 0x11, 0x8E, 0x10, 0x10,
  0x10, 0x8E, 0x8E, 0x10, 0x10, 0x8E, 0x10, 0x8E, 0x10, 0x8E, 0x8F, 0x8F, 0x8E, 0x8E,
  0x8E, 0x8E, 0x11, 0x11, 0x8E, 0x12, 0x8D, 0x8D, 0x8D, 0xAC, 0xAD, 0xAE, 0x11, 0x13,
  0xAA, 0x12, 0x01, 0xAE, 0xAD, 0x8B, 0xAC, 0x9A, 0xAB, 0x31, 0x31, 0x14, 0x8B, 0x8E,
  0x61, 0x8D, 0x02, 0x01, 0x01, 0x20, 0x02, 0x11, 0x13, 0x13, 0xAD, 0xAE, 0xAE, 0x8D,
  0xAE, 0x8E, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x10, 0x8E, 0x8E, 0x10, 0x10, 0x10,
  0x10, 0x8F, 0x8F, 0x11, 0x8F, 0x10, 0x8E, 0x8E, 0x8E, 0x10, 0x11, 0x11, 0x8E, 0xAE,
  0x8D, 0x8D, 0x8D, 0xAD, 0x8B, 0xAE, 0xAE, 0xAC, 0xAD, 0x01, 0x11, 0x20, 0x02, 0x13,
  0xAD, 0x14, 0xAB, 0x8F, 0x8F, 0x75, 0x15, 0x12, 0x8E, 0xAE, 0x02, 0x01, 0x20, 0x02,
  0x21, 0x10, 0x8D, 0x9C, 0x9C, 0xAC, 0x14, 0x72, 0x13, 0x8E, 0x10, 0x10, 0x8F, 0x11,
  0x10, 0x8E, 0x10, 0x10, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x10, 0x10, 0x8F, 0x8F, 0x10,
  0x11, 0x10, 0x11, 0x11, 0x11, 0x8E, 0xAE, 0x13, 0xAD, 0x14, 0x8B, 0x8B, 0x8B, 0x12,
  0x11, 0x8D, 0x02, 0x01, 0x20, 0x02, 0x21, 0x11, 0xAE, 0x9B, 0xA9, 0x8F, 0x8F, 0x16,
  0x15, 0x12, 0xAE, 0x11, 0x11, 0x02, 0x02, 0xDE, 0x8E, 0x8E, 0xAE, 0x9C, 0xAC, 0xAC,
  0x14, 0x11, 0xAE, 0x10, 0x10, 0x8E, 0x11, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x8F, 0x10, 0x10, 0x11, 0x11, 0x8F, 0x10,
  0x10, 0xAD, 0xAD, 0x14, 0x8B, 0x8B, 0x8B, 0x12, 0x71, 0x10, 0xAE, 0x02, 0x02, 0x21,
  0x11, 0x11, 0xAE, 0x15, 0xA9, 0x8F, 0x70, 0x16, 0x15, 0x12, 0xAE, 0x8D, 0x8E, 0x8E,
  0x11, 0xAE, 0x33, 0x8D, 0x8D, 0xAC, 0x8B, 0xAC, 0x8C, 0x8D, 0xAE, 0xAE, 0x8F, 0x10,
  0x8E, 0x11, 0x8E, 0x8E, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x10,
  0x10, 0x8F, 0x11, 0x10, 0x10, 0x8F, 0x11, 0x31, 0xAE, 0x11, 0x14, 0x14, 0x14, 0x8D,
  0x8B, 0x12, 0x71, 0x8F, 0x8E, 0x10, 0x8F, 0x11, 0x71, 0x11, 0x8D, 0x16, 0xAB, 0x8F,
  0x10, 0x16, 0xAC, 0x14, 0x12, 0xAE, 0x8E, 0x8E, 0x41, 0x10, 0xAE, 0x11, 0x8D, 0x13,
  0xAC, 0xAC, 0x8C, 0x13, 0x8D, 0x11, 0x8E, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x8F,
  0x8F, 0x31, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10,
  0x8F, 0x8F, 0x31, 0x8D, 0x8D, 0x14, 0xAC, 0x15, 0x8B, 0x8D, 0xAE, 0x11, 0x11, 0x8F,
  0x10, 0x13, 0x12, 0x8D, 0x8B, 0x74, 0xAC, 0x8F, 0x31, 0x17, 0x14, 0x13, 0x11, 0x11,
  0xAE, 0x12, 0x12, 0x12, 0xAD, 0x8D, 0x8C, 0x8C, 0x14, 0xAC, 0x14, 0xAD, 0x8D, 0x8E,
  0x10, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x8F,
  0x8F, 0x8F, 0x10, 0x8E, 0x8E, 0x10, 0x12, 0x12, 0x10, 0x11, 0x10, 0x11, 0x8D, 0x8D,
  0xAC, 0x8B, 0xAB, 0xAE, 0x11, 0x8D, 0x13, 0xAE, 0x8D, 0x8C, 0x8D, 0x8D, 0x72, 0x14,
  0xAC, 0x31, 0x10, 0xAA, 0xAD, 0xAE, 0xAE, 0x11, 0x11, 0x11, 0x11, 0x8D, 0x8D, 0x8D,
  0x8C, 0x8C, 0xAD, 0xAC, 0x14, 0x13, 0x8C, 0x11, 0x8E, 0x11, 0x10, 0x8E, 0x10, 0x10,
  0x8E, 0x8E, 0x8E, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x31, 0x10, 0x31, 0x8F, 0x10, 0x8F,
  0x11, 0x11, 0x11, 0x10, 0x10, 0xAE, 0x8D, 0x14, 0xAC, 0x8B, 0xAB, 0xAE, 0x11, 0x8D,
  0x13, 0x12, 0x8D, 0x8D, 0x14, 0x8D, 0x13, 0xAD, 0xAC, 0x31, 0x8F, 0xAC, 0x15, 0x8D,
  0xAD, 0xAE, 0xAE, 0xAE, 0xAE, 0x8D, 0xAE, 0x8D, 0x8D, 0x8B, 0xAD, 0xAC, 0x14, 0x13,
  0x13, 0x10, 0x11, 0x11, 0x10, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x8F, 0x8F, 0x8E, 0x8E,
  0x8E, 0x11, 0x8F, 0x8E, 0x8E, 0x8E, 0x31, 0x10, 0x8F, 0x8F, 0x11, 0x8E, 0x10, 0x11,
  0x8D, 0x14, 0x8C, 0x9C, 0xAB, 0xAE, 0x11, 0xAD, 0x13, 0x8D, 0x8D, 0x8D, 0x11, 0x8D,
  0x9C, 0x16, 0x75, 0x31, 0x70, 0xAC, 0x9C, 0x14, 0xAE, 0x8F, 0x10, 0xAE, 0x8D, 0x11,
  0x11, 0x8D, 0x8D, 0x8B, 0x13, 0xAC, 0x13, 0x8D, 0xAD, 0x10, 0x11, 0x11, 0x11, 0x10,
  0x8E, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x8E, 0x8F, 0x8F, 0x8F, 0x8E, 0x11,
  0x8F, 0x10, 0x8F, 0x8F, 0x8F, 0x8E, 0x8E, 0x11, 0x11, 0xAE, 0x8D, 0xAD, 0xAD, 0xAE,
  0xAE, 0x11, 0x11, 0xAE, 0xAE, 0x8D, 0x11, 0x11, 0x14, 0x14, 0x17, 0x31, 0x31, 0x16,
  0x9C, 0x8D, 0x11, 0x8D, 0x8D, 0x8E, 0x11, 0xAE, 0xAD, 0x11, 0x8D, 0x8C, 0x8B, 0xAC,
  0x8D, 0x13, 0xAE, 0x11, 0x11, 0x11, 0x11, 0x8E, 0x10, 0x10, 0x11, 0x10, 0x10, 0x8F,
  0x8F, 0x8E, 0x8F, 0x8F, 0x8F, 0x10, 0x8F, 0x11, 0x11, 0x10, 0x10, 0x8F, 0x10, 0x8F,
  0x10, 0x8C, 0x8C, 0x8D, 0x8D, 0xAD, 0x8B, 0x11, 0xAE, 0x11, 0xAE, 0x8D, 0xAE, 0xAE,
  0x11, 0xAE, 0x13, 0x14, 0x17, 0x31, 0x31, 0x17, 0xAD, 0x8D, 0xAD, 0x8D, 0x8D, 0x8D,
  0x8D, 0x8D, 0xAE, 0xAE, 0x8D, 0x14, 0x74, 0xAD, 0x8C, 0x13, 0x13, 0xAE, 0x11, 0x11,
  0x11, 0x8F, 0x8E, 0x10, 0x11, 0x8F, 0x11, 0x10, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8E,
  0x8F, 0x10, 0x11, 0x10, 0x11, 0x11, 0x11, 0x11, 0x10, 0x11, 0xAE, 0x8C, 0x8D, 0x8D,
  0x8B, 0x13, 0x11, 0xAE, 0x11, 0xAE, 0x11, 0xAE, 0xAE, 0xAE, 0x15, 0x14, 0xAA, 0x70,
  0x70, 0x17, 0x14, 0x8D, 0xAD, 0x8D, 0x8D, 0x8D, 0xAE, 0xAE, 0xAE, 0x8D, 0x8D, 0x8B,
  0x9B, 0x8B, 0x8C, 0x8D, 0xAE, 0x8E, 0x10, 0x8E, 0x8E, 0x10, 0x8F, 0x8F, 0x8E, 0x8F,
  0x10, 0x11, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x31, 0x31, 0x8F, 0x8F, 0x8F, 0x11, 0x10,
  0x8E, 0x10, 0xAE, 0x11, 0x8D, 0x8D, 0x8D, 0x8D, 0x8B, 0x14, 0xAE, 0xAE, 0x11, 0xAE,
  0xAE, 0x11, 0x11, 0xAE, 0xAE, 0x15, 0x16, 0x31, 0x31, 0x75, 0x14, 0x13, 0xAE, 0x8D,
  0x8D, 0x8D, 0xAE, 0xAE, 0xAE, 0x8D, 0x8D, 0x8C, 0xAC, 0xAC, 0x8D, 0x8D, 0x8D, 0x8E,
  0x8E, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x31, 0x31, 0x8F, 0x8F, 0x8F, 0x11, 0x8F, 0x10,
  0x10, 0x8F, 0x8F, 0x8F, 0x8F, 0x10, 0x12, 0x11, 0x12, 0x11, 0x10, 0x8D, 0xAE, 0x8D,
  0x8D, 0x14, 0xAD, 0x9C, 0xAE, 0xAE, 0x8D, 0xAE, 0x11, 0xAE, 0x13, 0xAD, 0x8C, 0x15,
  0x17, 0x70, 0x31, 0x75, 0x14, 0x13, 0xAE, 0x8D, 0x8D, 0x13, 0x12, 0x13, 0x13, 0x11,
  0x8C, 0x8C, 0x15, 0x72, 0x8C, 0x13, 0xAE, 0x8E, 0x8E, 0x10, 0x10, 0x8F, 0x10, 0x10,
  0x8F, 0x8F, 0x8F, 0x8F, 0x10, 0x12, 0x10, 0x10, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x10,
  0x10, 0x11, 0x10, 0x8E, 0x8E, 0xAC, 0x8C, 0x8D, 0x8D, 0x15, 0x8B, 0x14, 0x8E, 0x10,
  0xAE, 0xAE, 0xAE, 0xAE, 0x13, 0xAD, 0x14, 0x9C, 0x17, 0x31, 0x31, 0xAA, 0x16, 0x13,
  0x8D, 0xAE, 0x8D, 0x8D, 0x8D, 0x13, 0x13, 0xAD, 0xAD, 0x15, 0xAD, 0xAD, 0x8D, 0x8D,
  0x8D, 0x8E, 0x8E, 0x8F, 0x10, 0x8F, 0x10, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x10, 0x10,
  0x11, 0x11, 0x8E, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x8F, 0x11, 0x8F, 0x11, 0x10, 0x12,
  0x13, 0x14, 0x8D, 0x8D, 0x8B, 0x8D, 0x13, 0x8D, 0x8C, 0xAE, 0xAE, 0x8D, 0xAD, 0x9C,
  0x8D, 0xAC, 0x17, 0x10, 0x70, 0x16, 0x14, 0x14, 0xAD, 0xAE, 0xAE, 0x8D, 0x8D, 0x11,
  0x8D, 0x11, 0x8D, 0x14, 0xAD, 0x8C, 0x8B, 0x8D, 0xAE, 0x10, 0x8F, 0x10, 0x8F, 0x11,
  0x11, 0x8E, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x8F, 0x11, 0x8E, 0x8E, 0x10, 0x10, 0x11,
  0xAE, 0x11, 0x10, 0x8E, 0x8F, 0x10, 0x11, 0x11, 0xAE, 0x14, 0x72, 0x8D, 0x14, 0x12,
  0x13, 0x12, 0x13, 0x8D, 0x12, 0x13, 0x12, 0x12, 0xAC, 0xAC, 0xAA, 0x70, 0x10, 0x16,
  0x8B, 0xAE, 0xAD, 0x11, 0x11, 0x8D, 0x8D, 0x11, 0xAE, 0x13, 0xAC, 0xAC, 0x13, 0x14,
  0x8C, 0x8D, 0xAE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x10, 0x10, 0x11, 0xAE,
  0x11, 0x10, 0x10, 0x10, 0x8F, 0x8E, 0x10, 0x8E, 0x11, 0x11, 0x11, 0x10, 0x11, 0x10,
  0x10, 0xAE, 0x8C, 0x13, 0x72, 0x14, 0x14, 0x72, 0x11, 0x13, 0x13, 0x13, 0x14, 0x14,
  0x13, 0x8D, 0xAD, 0x14, 0x16, 0x31, 0x31, 0x14, 0x9C, 0x8C, 0x13, 0x8D, 0x8D, 0x13,
  0x11, 0x8D, 0x13, 0x13, 0x8D, 0xAD, 0x13, 0x14, 0x8D, 0x8D, 0x13, 0x8E, 0x10, 0x8E,
  0x8E, 0x8F, 0x10, 0x8F, 0x8E, 0x10, 0x8E, 0x11, 0x11, 0x8E, 0x8F, 0x31, 0x8F, 0x8F,
  0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x12, 0x13, 0x8D, 0x72, 0x14,
  0x14, 0x12, 0x8E, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x8C, 0x14, 0x14, 0x14, 0x31,
  0x31, 0x16, 0x8D, 0x8C, 0x11, 0x8D, 0xAE, 0xAE, 0x12, 0xAD, 0x13, 0xAD, 0x8D, 0xAD,
  0x8B, 0x72, 0x13, 0x72, 0x13, 0x8E, 0x10, 0x8E, 0x8E, 0x8F, 0x31, 0x8F, 0x8F, 0x10,
  0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12,
  0x10, 0x10, 0x10, 0x12, 0x13, 0x8D, 0x72, 0x14, 0x14, 0x12, 0x12, 0x11, 0x60, 0x13,
  0x13, 0xAD, 0x11, 0x13, 0xAB, 0x9C, 0x9A, 0x31, 0x31, 0x16, 0x9C, 0x8C, 0xAE, 0xAE,
  0x8D, 0x13, 0x13, 0xAE, 0x8D, 0x8D, 0x12, 0x14, 0x14, 0x72, 0x13, 0x72, 0x13, 0x10,
  0x10, 0x8F, 0x11, 0x8F, 0x10, 0x8E, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x11,
  0x8F, 0x8F, 0x10, 0x11, 0x10, 0x8E, 0x8E, 0x8E, 0x10, 0x10, 0x10, 0x12, 0x13, 0x14,
  0x14, 0x15, 0x14, 0x12, 0xAE, 0x11, 0x12, 0x12, 0x13, 0x13, 0xAD, 0xAD, 0x15, 0x14,
  0x16, 0x70, 0x31, 0xAA, 0xAD, 0x8C, 0xAE, 0x11, 0x8D, 0xAE, 0x8E, 0xAE, 0x8D, 0x12,
  0x8D, 0x13, 0x15, 0x8C, 0x8D, 0xAE, 0xAD, 0x8F, 0x31, 0x70, 0x10, 0x10, 0x10, 0x10,
  0x8F, 0x10, 0x10, 0x10, 0x8F, 0x8E, 0x10, 0x10, 0x11, 0x8F, 0x8E, 0x11, 0x11, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x13, 0x14, 0x14, 0x15, 0x15, 0x12, 0x12, 0x12,
  0x12, 0x12, 0x13, 0x13, 0x13, 0x8C, 0x14, 0x9C, 0x9A, 0x70, 0x30, 0x16, 0x15, 0xAE,
  0x12, 0x12, 0x11, 0x11, 0x8D, 0x11, 0xAE, 0x8D, 0x8D, 0x12, 0x14, 0x72, 0x14, 0xAE,
  0xAE, 0x10, 0x8E, 0x8E, 0x11, 0x8E, 0x8E, 0x10, 0x8F, 0x11, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x8E, 0x11, 0x8E, 0x10, 0x11, 0x12, 0x8E, 0x8E, 0x8F, 0x10, 0x8E, 0x10, 0x12,
  0x14, 0x14, 0x8D, 0x8D, 0x62, 0x8D, 0x8D, 0xAE, 0xAE, 0x12, 0x13, 0x13, 0x8C, 0x13,
  0x14, 0x15, 0x9A, 0x70, 0x30, 0xAA, 0xAC, 0x13, 0x11, 0x11, 0xAE, 0xAE, 0x13, 0x13,
  0x12, 0x12, 0x12, 0x72, 0x8B, 0x8D, 0x13, 0xAE, 0x8D, 0x8E, 0x8F, 0x10, 0x10, 0x8E,
  0x11, 0x10, 0x10, 0x11, 0x8E, 0x10, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, 0x8F, 0x10, 0x11,
  0x11, 0x8E, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x12, 0x14, 0x14, 0x8D, 0x8D, 0x8B, 0x12,
  0x12, 0xAE, 0xAE, 0x13, 0x13, 0x13, 0x13, 0x14, 0x15, 0x14, 0x17, 0x31, 0x40, 0x9A,
  0x15, 0xAE, 0x11, 0xAE, 0xAE, 0x11, 0x8D, 0x8D, 0x12, 0x11, 0xAE, 0x8C, 0x8B, 0x8D,
  0x8D, 0xAE, 0x8D, 0x8E, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x10, 0x10, 0x10,
  0x10, 0x8E, 0x8E, 0x8E, 0x8E, 0x11, 0x10, 0x8E, 0x10, 0x11, 0x10, 0x11, 0x10, 0x8E,
  0x10, 0x12, 0x13, 0x14, 0x14, 0x8D, 0x14, 0x8D, 0x8D, 0x12, 0x12, 0x12, 0x13, 0x13,
  0x13, 0x13, 0x14, 0x15, 0xAC, 0x70, 0x40, 0xAC, 0xAD, 0x8D, 0xAE, 0x8F, 0xAE, 0x11,
  0x12, 0x8D, 0x11, 0x13, 0x8D, 0x8C, 0x8B, 0x8D, 0x8D, 0x8D, 0xAE, 0x10, 0x10, 0x8E,
  0x10, 0x11, 0x8E, 0x10, 0x12, 0x8E, 0x10, 0x8F, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10,
  0x11, 0x10, 0x8E, 0x11, 0x10, 0x11, 0x8E, 0x10, 0x10, 0xAE, 0x13, 0x13, 0x8D, 0xAD,
  0x15, 0x8D, 0x12, 0x13, 0x8D, 0xAE, 0x8D, 0x13, 0xAD, 0x12, 0x8C, 0x9C, 0xAB, 0x31,
  0x31, 0x9C, 0x13, 0xAE, 0x8F, 0x10, 0xAE, 0xAD, 0x13, 0xAE, 0x11, 0x8D, 0x8D, 0xAD,
  0xAD, 0x8C, 0x8D, 0x72, 0xAE, 0x8F, 0x8F, 0x10, 0x10, 0x11, 0x8E, 0x10, 0x11, 0x8E,
  0x10, 0x10, 0x8E, 0x10, 0x8E, 0x10, 0x10, 0x8F, 0x11, 0x11, 0x10, 0x8E, 0x8E, 0x8E,
  0x11, 0x8F, 0x10, 0x11, 0x8D, 0x8D, 0x8C, 0x13, 0xAC, 0x72, 0x13, 0xAD, 0xAE, 0x11,
  0x11, 0xAE, 0xAD, 0x12, 0x14, 0x14, 0x14, 0x31, 0x31, 0x9C, 0x11, 0x8D, 0x11, 0x8F,
  0xAE, 0xAE, 0x13, 0x8C, 0x8C, 0x8D, 0xAE, 0xAD, 0x8B, 0x8C, 0x8D, 0x8D, 0xAE, 0x10,
  0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x11, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x8F,
  0x8F, 0x10, 0x8F, 0x11, 0x10, 0x11, 0x10, 0x11, 0x11, 0x8E, 0x11, 0x11, 0x8D, 0x8D,
  0x15, 0x16, 0x14, 0x12, 0x12, 0xAE, 0x11, 0x8D, 0x8D, 0xAD, 0xAD, 0x12, 0xAB, 0x9C,
  0x9A, 0x31, 0x70, 0x12, 0x8E, 0x13, 0xAE, 0xAE, 0xAE, 0x8D, 0x8C, 0x14, 0xAE, 0x8D,
  0x8C, 0x8B, 0xAD, 0x14, 0x8C, 0x8D, 0xAE, 0x8E, 0x8F, 0x8F, 0x8E, 0x11, 0x8F, 0x8E,
  0x8E, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x11, 0x11, 0x8F, 0x8F, 0x10, 0x8F, 0x11, 0x11,
  0x8F, 0x11, 0x11, 0x11, 0x8E, 0x11, 0x8C, 0x14, 0x8C, 0xAD, 0xAC, 0xAD, 0xAD, 0xAD,
  0x12, 0x11, 0x11, 0x8D, 0xAE, 0xAD, 0x15, 0x14, 0x16, 0x70, 0x31, 0x16, 0x13, 0x8C,
  0x11, 0xAE, 0xAE, 0xAE, 0x8D, 0x8D, 0x14, 0x14, 0x8D, 0x8C, 0x8B, 0xAD, 0x8D, 0x8D,
  0x8D, 0x10, 0x10, 0x11, 0x8E, 0x10, 0x10, 0x8F, 0x8F, 0x8E, 0x10, 0x10, 0x8E, 0x8F,
  0x8F, 0x8F, 0x8F, 0x10, 0x8E, 0x8E, 0x8E, 0x10, 0x8E, 0x11, 0x8E, 0x11, 0x10, 0x12,
  0x8D, 0x8C, 0xAD, 0x14, 0x15, 0x72, 0x12, 0x8D, 0x8D, 0x13, 0x8D, 0xAE, 0x13, 0x8C,
  0x14, 0x9C, 0x9A, 0x70, 0x31, 0x16, 0x9C, 0x8C, 0xAD, 0x11, 0x11, 0x72, 0x14, 0x8C,
  0x13, 0x14, 0x13, 0xAD, 0x8B, 0x8C, 0x8C, 0x8D, 0xAE, 0x8E, 0x8F, 0x8E, 0x8E, 0x8E,
  0x8E, 0x8F, 0x8F, 0x8E, 0x8E, 0x8F, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x8E, 0x10, 0x8E, 0x11, 0xAE, 0xAE, 0x13, 0xAD, 0x8C, 0x14, 0x8B, 0xAE,
  0x11, 0x13, 0x11, 0xAD, 0x13, 0x8C, 0x8C, 0x13, 0x14, 0x15, 0x9A, 0x70, 0x70, 0x17,
  0x9C, 0x8C, 0x8D, 0x8E, 0x13, 0x8D, 0x8C, 0x13, 0x8C, 0x8D, 0x12, 0x12, 0x8D, 0x8D,
  0xAE, 0x13, 0x11, 0x10, 0x8F, 0x11, 0x10, 0x10, 0x8E, 0x8F, 0x8F, 0x8F, 0x11, 0x8E,
  0x10, 0x10, 0x8F, 0x8F, 0x10, 0x8F, 0x10, 0x10, 0x8E, 0x10, 0x11, 0x11, 0x12, 0x11,
  0x8E, 0x13, 0xAD, 0x14, 0x8D, 0xAD, 0x15, 0x13, 0xAE, 0x11, 0x13, 0x13, 0x13, 0x8C,
  0x13, 0x14, 0x15, 0x14, 0x17, 0x31, 0x31, 0xAC, 0xAD, 0x8D, 0xAE, 0xAE, 0x13, 0x8E,
  0x13, 0x13, 0x8C, 0x13, 0xAE, 0x72, 0x8D, 0xAD, 0xAE, 0xAE, 0xAE, 0x8E, 0x8F, 0x8E,
  0x8E, 0x8E, 0x10, 0x31, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x11, 0x8F, 0x8F, 0x10, 0x10,
  0x10, 0x10, 0x12, 0x12, 0x10, 0x11, 0x10, 0x8D, 0x13, 0x14, 0x15, 0x13, 0x8D, 0xAC,
  0xAB, 0xAD, 0x13, 0xAD, 0x8D, 0x8C, 0x8C, 0x13, 0x8D, 0x13, 0x14, 0x15, 0xAC, 0x70,
  0x31, 0x14, 0xAD, 0x8C, 0x13, 0x12, 0x8D, 0x13, 0x13, 0xAE, 0xAE, 0xAE, 0xAE, 0xAD,
  0x9C, 0x8D, 0xAE, 0xAE, 0xAE, 0x10, 0x11, 0x10, 0x10, 0x11, 0x11, 0x31, 0x10, 0x10,
  0x10, 0x11, 0x11, 0x8E, 0x8E, 0x8F, 0x8E, 0x10, 0x8E, 0x11, 0x8E, 0x10, 0x12, 0x11,
  0x10, 0x11, 0xAE, 0x8D, 0x14, 0xAE, 0x8D, 0x8B, 0xAD, 0x8D, 0xAE, 0xAD, 0x8E, 0x11,
  0x8D, 0x8D, 0x8C, 0x12, 0x8C, 0x9C, 0x9A, 0x31, 0x31, 0x14, 0xAD, 0x8D, 0x12, 0x8D,
  0x12, 0x12, 0x11, 0x8D, 0x8D, 0x8D, 0x8D, 0xAD, 0xAD, 0x14, 0x8D, 0x8D, 0x8D, 0x10,
  0x10, 0x10, 0x11, 0x8E, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x11, 0x8E, 0x11,
  0x11, 0x11, 0x10, 0x8E, 0x10, 0x10, 0x8E, 0x11, 0x8E, 0x10, 0x10, 0x8D, 0x8C, 0x14,
  0xAC, 0x15, 0x15, 0x8D, 0xAE, 0xAE, 0x8E, 0x8D, 0x11, 0x8D, 0x8D, 0xAE, 0x8C, 0x8B,
  0x9A, 0x70, 0x31, 0x14, 0x8D, 0x8D, 0x11, 0x8D, 0x8D, 0x8D, 0x13, 0x8D, 0xAE, 0xAE,
  0x12, 0x13, 0x15, 0x14, 0x8D, 0x8D, 0x8D, 0x10, 0x8E, 0x8F, 0x10, 0x8E, 0x10, 0x10,
  0x8F, 0x8F, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x10, 0x11, 0x10, 0x10, 0x8F, 0x8E, 0x8E,
  0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x14, 0x14, 0xAC, 0x8D, 0x13, 0xAE, 0xAE, 0x8D,
  0x8D, 0x11, 0xAE, 0x8D, 0x8D, 0x8D, 0x14, 0x8C, 0xAB, 0xBF, 0x31, 0xAC, 0x8D, 0xAE,
  0x11, 0x13, 0x13, 0x11, 0xAD, 0x12, 0x8D, 0xAE, 0x8D, 0x72, 0x15, 0x14, 0x8D, 0xAE,
  0xAE, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x8E, 0x10, 0x11, 0x8F,
  0x10, 0x10, 0x11, 0x8E, 0x8E, 0x10, 0x11, 0x11, 0x10, 0x8E, 0x11, 0x8F, 0x10, 0x13,
  0x8C, 0x14, 0x8C, 0x8B, 0xAD, 0xAD, 0x11, 0xAE, 0xAE, 0x8D, 0x8D, 0x8D, 0x12, 0xAE,
  0x8C, 0x15, 0x16, 0x70, 0x31, 0xAC, 0xAD, 0x8D, 0xAE, 0xAE, 0x11, 0x13, 0x12, 0x12,
  0x8D, 0x12, 0x12, 0x13, 0xAD, 0xAC, 0xAE, 0x11, 0xAE, 0x8E, 0x8F, 0x8F, 0x10, 0x10,
  0x8F, 0x8F, 0x10, 0x8E, 0x10, 0x8F, 0x8E, 0x8F, 0x12, 0x10, 0x11, 0x12, 0x11, 0x11,
  0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x12, 0xAD, 0x14, 0x8C, 0x14, 0x8B, 0x12,
  0xAE, 0x11, 0x11, 0x11, 0x11, 0xAE, 0x13, 0x8D, 0x8C, 0x14, 0xAC, 0x31, 0x70, 0x14,
  0x13, 0x8D, 0x11, 0xAE, 0x11, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x13, 0x72, 0xAC, 0xAD,
  0xAD, 0x8D, 0x8D, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x11, 0x11, 0x8E, 0x8E, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x11, 0x8E, 0x11, 0x11, 0x10, 0x11, 0x11, 0x10,
  0x8E, 0x8D, 0x13, 0x14, 0xAC, 0xAC, 0x8B, 0x8D, 0x11, 0x11, 0x11, 0x11, 0xAE, 0xAE,
  0xAE, 0x8D, 0x72, 0xAD, 0x16, 0x31, 0x31, 0x14, 0x13, 0x13, 0xAE, 0xAE, 0x13, 0x12,
  0xAE, 0xAE, 0xAE, 0xAE, 0x8D, 0x12, 0x15, 0x14, 0x8C, 0x8D, 0x8D, 0x10, 0x10, 0x8F,
  0x8F, 0x8F, 0x10, 0x8E, 0x8E, 0x10, 0x8E, 0x10, 0x10, 0x8E, 0x11, 0x11, 0x8E, 0x8E,
  0x11, 0x11, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8D, 0x8D, 0x14, 0xAC, 0x14,
  0x8B, 0x8D, 0x8D, 0xAE, 0xAE, 0x11, 0xAE, 0xAE, 0x8D, 0xAE, 0x13, 0xAD, 0x16, 0x31,
  0x31, 0x9C, 0x8D, 0xAE, 0x11, 0x11, 0x11, 0x11, 0x11, 0xAE, 0x11, 0x11, 0x11, 0x14,
  0x15, 0x14, 0x8C, 0xAE, 0x11, 0x10, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x8F, 0x8F, 0x10,
  0x10, 0x8E, 0x10, 0x10, 0x8E, 0x10, 0x11, 0x8E, 0x11, 0x11, 0x10, 0x8E, 0x10, 0x8E,
  0x10, 0x10, 0x10, 0x8D, 0x8D, 0x14, 0xAC, 0x14, 0x8B, 0x8D, 0x8D, 0x8D, 0xAE, 0xAE,
  0xAE, 0x8D, 0xAE, 0xAD, 0x14, 0x9C, 0x17, 0x10, 0xBF, 0xAD, 0xAD, 0x8C, 0x11, 0x13,
  0x11, 0xAE, 0xAE, 0xAE, 0x11, 0x11, 0x11, 0xAE, 0x13, 0x72, 0x8C, 0xAE, 0x11, 0x10,
  0x10, 0x10, 0x8F, 0x8E, 0x11, 0x8E, 0x8E, 0x8D, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x8E,
  0x8E, 0x11, 0x11, 0x8F, 0x8F, 0x8E, 0x8E, 0x10, 0x10, 0x8E, 0x10, 0xAE, 0xAE, 0x14,
  0x72, 0x8B, 0x8B, 0x8D, 0xAE, 0xAE, 0x13, 0x8D, 0x8D, 0x11, 0x11, 0x8D, 0xAD, 0x14,
  0x17, 0x31, 0x31, 0x17, 0x9C, 0x8D, 0x11, 0x12, 0x8D, 0xAE, 0xAE, 0xAE, 0xAE, 0x11,
  0xAE, 0x8D, 0x13, 0x8D, 0x8C, 0x8D, 0xAE, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x11,
  0x12, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x8E, 0x8E, 0x8F,
  0x8F, 0x10, 0x11, 0x8F, 0x10, 0xAE, 0x8D, 0x14, 0x8D, 0x8D, 0x8B, 0xAD, 0xAD, 0xAD,
  0xAC, 0xAE, 0x11, 0x11, 0x8E, 0x12, 0xAD, 0x13, 0x9C, 0x31, 0x31, 0xAC, 0x9C, 0x8C,
  0x12, 0x12, 0x8D, 0x13, 0xAE, 0x11, 0x8D, 0x8E, 0xAE, 0x8D, 0x8B, 0x8D, 0x8D, 0x8D,
  0xAE, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x11, 0x11, 0x10, 0x10, 0x8E, 0x8F,
  0x10, 0x11, 0x10, 0x10, 0x11, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x10, 0x10, 0x8E, 0x12,
  0x14, 0x8C, 0x8C, 0xAD, 0x8B, 0x8D, 0x12, 0x11, 0x13, 0x13, 0x13, 0x13, 0x8B, 0x13,
  0x8C, 0x14, 0x8C, 0x40, 0x70, 0x17, 0x72, 0x8D, 0x12, 0x8D, 0x13, 0x8D, 0x8D, 0x12,
  0x8D, 0x11, 0x13, 0x12, 0x8D, 0x8D, 0xAE, 0x8D, 0xAE, 0x10, 0x8F, 0x8F, 0x8F, 0x10,
  0x10, 0x10, 0x10, 0x11, 0x8E, 0x11, 0x8E, 0x8E, 0x8E, 0x10, 0x10, 0x8E, 0x11, 0x8E,
  0x8E, 0x8E, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x8D, 0x8C, 0x8C, 0x8D, 0xAD, 0x13, 0x8D,
  0x11, 0xAE, 0xAE, 0x13, 0x12, 0x12, 0x11, 0x11, 0x14, 0x9C, 0x9A, 0x40, 0x31, 0x17,
  0x9C, 0x12, 0x12, 0x71, 0x12, 0x13, 0x8D, 0x13, 0x13, 0x11, 0x13, 0x12, 0x14, 0xAD,
  0x8D, 0xAE, 0xAE, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x8E, 0x10,
  0x8E, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x8E, 0x10, 0x10, 0x10, 0x8E,
  0x10, 0x11, 0x8C, 0xAE, 0xAE, 0x9C, 0x13, 0x8D, 0x10, 0x13, 0x13, 0x13, 0x13, 0x13,
  0x13, 0xAD, 0x8D, 0x13, 0x75, 0xBF, 0x31, 0x17, 0x9C, 0x12, 0x12, 0x12, 0x16, 0x99,
  0x9A, 0x9C, 0x12, 0xAD, 0x12, 0xCD, 0x13, 0x8D, 0xAE, 0xAD, 0x8D, 0x8E, 0x10, 0x8F,
  0x8E, 0x8E, 0x8E, 0x8E, 0xAE, 0x8E, 0x11, 0x10, 0x8E, 0x10, 0x11, 0x8E, 0x11, 0x11,
  0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x11, 0x8F, 0x8E, 0x11, 0x8C, 0x8D, 0xAC, 0x8D,
  0x13, 0x8D, 0x8E, 0x13, 0xAC, 0x75, 0x16, 0x14, 0x13, 0xAD, 0x8D, 0xAC, 0x74, 0x40,
  0x40, 0x9A, 0x9C, 0x8E, 0x13, 0x73, 0x75, 0x77, 0xAB, 0xAC, 0xAC, 0x13, 0xAE, 0xAD,
  0x8B, 0x72, 0xAE, 0xAE, 0xAE, 0x11, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x10, 0x10,
  0x10, 0x11, 0x10, 0x11, 0x8E, 0x31, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x10, 0x8E,
  0x11, 0x11, 0xAE, 0x13, 0x8D, 0xAE, 0x8D, 0x8D, 0xAD, 0x12, 0x60, 0xAC, 0x79, 0x7B,
  0x8A, 0xAC, 0xAD, 0x71, 0x8D, 0x13, 0x9B, 0x40, 0x31, 0x9A, 0xAC, 0x8E, 0x60, 0x13,
  0x76, 0x13, 0x11, 0xAE, 0xAD, 0xAD, 0x13, 0x72, 0x8B, 0x8D, 0xAE, 0x8D, 0xAE, 0x11,
  0x10, 0x8F, 0x10, 0x8E, 0x11, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x8E, 0x8F,
  0x8F, 0x8E, 0x10, 0x11, 0x12, 0x11, 0x8F, 0x8E, 0x8E, 0x8F, 0x10, 0x12, 0x8D, 0x8D,
  0xAE, 0xAD, 0xAD, 0x11, 0x60, 0xAB, 0xA9, 0x13, 0xAE, 0xAE, 0x02, 0x71, 0x60, 0x13,
  0x74, 0x40, 0x30, 0x13, 0x11, 0xAE, 0x12, 0x14, 0xAD, 0x01, 0x01, 0x20, 0x02, 0x12,
  0x60, 0xCD, 0xAD, 0x72, 0x8C, 0xAE, 0xAE, 0x10, 0x10, 0x8F, 0x11, 0x8E, 0x10, 0x8E,
  0x10, 0x11, 0x8E, 0x11, 0x10, 0x10, 0x8F, 0x8F, 0x31, 0x8F, 0x10, 0x8F, 0x11, 0x12,
  0x8E, 0x8E, 0x8E, 0x11, 0x13, 0xAD, 0x8D, 0x14, 0xAE, 0xAD, 0x13, 0x12, 0x71, 0x9C,
  0x8B, 0x11, 0xAE, 0x20, 0x02, 0x11, 0x12, 0x14, 0x14, 0x40, 0x40, 0x73, 0x13, 0x8E,
  0x10, 0x12, 0xAD, 0xAE, 0x20, 0x02, 0x21, 0x12, 0x71, 0xAD, 0x13, 0x8C, 0xAE, 0x8D,
  0x11, 0x10, 0x10, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x11, 0x11,
  0x12, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x10, 0x11, 0x10, 0x10, 0x11, 0xAE, 0x8D,
  0x8D, 0x14, 0x14, 0x8D, 0xAD, 0x11, 0x11, 0xAE, 0xAC, 0xAE, 0x20, 0x02, 0xAE, 0x11,
  0x12, 0x14, 0x74, 0x31, 0x31, 0x73, 0x13, 0xAE, 0x10, 0x12, 0xAE, 0x02, 0x02, 0x21,
  0x11, 0x71, 0x71, 0x72, 0xAD, 0x8C, 0x8D, 0x8D, 0x13, 0x10, 0x11, 0x8E, 0x11, 0x8E,
  0x10, 0x11, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x8F, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10,
  0x10, 0x10, 0x11, 0x11, 0x10, 0x8E, 0x8E, 0x11, 0x8C, 0x13, 0x72, 0x15, 0x15, 0xAE,
  0x11, 0x8D, 0xAE, 0x02, 0x02, 0x21, 0x10, 0x12, 0xAD, 0x14, 0x16, 0x31, 0x31, 0x73,
  0x13, 0x8D, 0xAE, 0x11, 0x71, 0x12, 0x11, 0x8E, 0x71, 0x12, 0x8D, 0xAD, 0xAD, 0x8D,
  0xAD, 0x72, 0x8D, 0x8E, 0x10, 0x10, 0x11, 0x11, 0x10, 0x8E, 0x8F, 0x10, 0x10, 0x10,
  0x8F, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x11, 0x11, 0x8E, 0x10,
  0x10, 0x12, 0x13, 0x13, 0x72, 0x14, 0x14, 0xAE, 0xAE, 0x60, 0x12, 0x12, 0x11, 0x11,
  0x12, 0xCE, 0x8D, 0x8D, 0x8C, 0x70, 0x70, 0x17, 0x14, 0x13, 0x12, 0xAE, 0x12, 0xAE,
  0xAE, 0x8D, 0x8D, 0xAE, 0xAD, 0x8C, 0xAD, 0x8D, 0x12, 0x8D, 0x13, 0x8E, 0x8E, 0x8E,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x10, 0x11, 0x11, 0x12, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0xAE, 0xAD, 0x8C, 0x8C, 0x13,
  0xAB, 0xAE, 0x8D, 0xAE, 0x13, 0x13, 0xAD, 0xAD, 0x13, 0x8D, 0x13, 0x8D, 0x13, 0x32,
  0x10, 0x75, 0x13, 0xAE, 0x8D, 0xAE, 0x11, 0x8D, 0x8D, 0xAE, 0xAE, 0x8D, 0xAE, 0xAD,
  0xAD, 0x11, 0x8E, 0x13, 0x12, 0x8E, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x8F, 0x10, 0x8F,
  0x10, 0x8E, 0x10, 0x10, 0x10, 0x31, 0x31, 0x11, 0x10, 0x10, 0x11, 0x10, 0x10, 0x10,
  0x10, 0x11, 0x10, 0x11, 0x12, 0xAD, 0xAC, 0x14, 0x14, 0x8D, 0x12, 0x8D, 0x8D, 0x13,
  0x13, 0xAD, 0x13, 0x13, 0x13, 0x8D, 0x15, 0x70, 0x32, 0x15, 0x14, 0xAE, 0x12, 0x11,
  0x11, 0x11, 0xAE, 0xAE, 0x12, 0x8D, 0x13, 0xAD, 0xAC, 0xAC, 0xAE, 0x13, 0x12, 0x8E,
  0x10, 0x10, 0x70, 0x8F, 0x10, 0x8F, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x11, 0x10, 0x11,
  0x11, 0x11, 0x8E, 0x11, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x8D, 0x13,
  0xAD, 0x14, 0xAC, 0xAE, 0x12, 0x12, 0x8D, 0xAE, 0x12, 0x8D, 0xAE, 0x8D, 0x8D, 0x14,
  0x74, 0x31, 0x32, 0x14, 0x8C, 0x8B, 0xAE, 0x11, 0xAE, 0x11, 0x11, 0x11, 0x12, 0x8D,
  0x8D, 0x8D, 0xAD, 0xAD, 0x8C, 0xAD, 0xAE, 0x11, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x8F,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x8E, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x11, 0x11, 0x10, 0x11, 0xAE, 0xAE, 0x8D, 0x8D, 0xAC, 0xAE, 0x12, 0x13,
  0xAE, 0xAE, 0xAE, 0xAE, 0x8D, 0x13, 0x13, 0x8D, 0xAD, 0x40, 0x32, 0x15, 0x14, 0xAE,
  0x11, 0xAE, 0xAE, 0x11, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAD, 0xAD, 0x13, 0xAD, 0x13,
  0xAE, 0x11, 0x10, 0x10, 0x8F, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x8F, 0x8E, 0x10, 0x10,
  0x8E, 0x12, 0x11, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x8F, 0x10, 0x11, 0xAE,
  0x12, 0xAE, 0x8D, 0x14, 0x15, 0x8D, 0x8D, 0x12, 0x12, 0x8D, 0x12, 0xAE, 0x8D, 0x8D,
  0x8D, 0x8D, 0xAD, 0x70, 0x32, 0x74, 0x13, 0x13, 0xAE, 0x8D, 0x8D, 0x11, 0x11, 0x11,
  0xAE, 0x11, 0x8D, 0xAD, 0x14, 0xAD, 0x8D, 0xAE, 0x8D, 0x11, 0x10, 0x10, 0x10, 0x11,
  0x10, 0x8E, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x8D, 0x10, 0xAE, 0x11, 0x11, 0x11, 0x11,
  0x11, 0x11, 0x10, 0x11, 0x8F, 0x10, 0x10, 0x11, 0x8D, 0x13, 0xAD, 0x8D, 0x14, 0xAE,
  0xAE, 0x8D, 0x11, 0x13, 0x13, 0xAE, 0xAE, 0xAE, 0x8D, 0x8D, 0x15, 0x70, 0x8F, 0x74,
  0x13, 0x13, 0xAE, 0x12, 0xAE, 0x8D, 0x11, 0x8D, 0x13, 0x8C, 0x13, 0x13, 0x9C, 0x9C,
  0x8C, 0x8D, 0x8B, 0x8E, 0x10, 0x8F, 0x10, 0x8E, 0x11, 0x8E, 0x8E, 0x8E, 0x8F, 0x10,
  0x8F, 0x11, 0x10, 0x11, 0x11, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x11, 0x10,
  0x10, 0x11, 0x12, 0x12, 0x13, 0x8B, 0x15, 0x12, 0x8D, 0x11, 0xAE, 0x13, 0xAE, 0x13,
  0x8D, 0x8D, 0x8C, 0xAC, 0x74, 0x31, 0x70, 0x74, 0x13, 0x13, 0x12, 0xAE, 0x12, 0x8D,
  0xAE, 0x13, 0xAD, 0x13, 0x8C, 0x8D, 0x13, 0x8D, 0x9C, 0x14, 0x12, 0x11, 0x10, 0x31,
  0x31, 0x10, 0x10, 0x8E, 0x10, 0x8F, 0x8F, 0x8F, 0x10, 0x11, 0x11, 0x8E, 0x10, 0x11,
  0x10, 0x11, 0x8E, 0x8E, 0x11, 0x10, 0x10, 0x10, 0x11, 0xAE, 0x13, 0x14, 0x8C, 0x8C,
  0xAD, 0x8D, 0xAE, 0x8D, 0xAE, 0x11, 0xAE, 0xAE, 0xAE, 0xAE, 0x13, 0x13, 0x14, 0x40,
  0x31, 0x73, 0x13, 0x13, 0x8D, 0x8D, 0x8D, 0x8E, 0xAE, 0x13, 0x11, 0x13, 0xAE, 0x8C,
  0x8C, 0x14, 0x14, 0x13, 0x14, 0x11, 0x11, 0x11, 0x8F, 0x8E, 0x10, 0x8E, 0x10, 0x10,
  0x10, 0x8E, 0x10, 0x10, 0x8F, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x10,
  0x11, 0x11, 0x11, 0x11, 0x8D, 0x8D, 0xAD, 0xAD, 0x8B, 0x11, 0xAE, 0x11, 0xAE, 0x8E,
  0x8F, 0x8E, 0x8F, 0xAE, 0xAE, 0x13, 0x9A, 0x40, 0x40, 0x15, 0x13, 0xAE, 0x11, 0xAE,
  0x12, 0x12, 0xAD, 0x8D, 0x8D, 0xAD, 0xAD, 0x8C, 0x8B, 0xAD, 0x13, 0x13, 0x13, 0x8E,
  0x10, 0x10, 0x8E, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x8F, 0x10,
  0x10, 0x10, 0x8E, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x11, 0x10, 0x11, 0x8D, 0x8C,
  0x8C, 0x8D, 0x13, 0x8D, 0x8E, 0x11, 0x8D, 0x14, 0x8B, 0x8D, 0x11, 0xAE, 0x8D, 0x8D,
  0x8B, 0x40, 0x30, 0x13, 0x8D, 0x11, 0x11, 0x8D, 0x74, 0x64, 0x8A, 0xAC, 0x15, 0xAD,
  0x8D, 0x15, 0xAC, 0x13, 0x8D, 0x8D, 0x13, 0x11, 0x10, 0x10, 0x11, 0x8E, 0x10, 0x10,
  0x8F, 0x8F, 0x31, 0x10, 0x8E, 0x8F, 0x11, 0x8F, 0x10, 0x8E, 0x8F, 0x8F, 0x8F, 0x8F,
  0x8F, 0x10, 0x10, 0x11, 0x8E, 0x11, 0x11, 0xAE, 0x8D, 0x14, 0xAE, 0xAE, 0x8E, 0x8D,
  0x75, 0x68, 0xAC, 0x8B, 0x8D, 0x8E, 0x11, 0x8D, 0x15, 0x31, 0x30, 0x13, 0x8D, 0x11,
  0x11, 0x13, 0xAA, 0x12, 0x01, 0xAE, 0xAD, 0x8B, 0xAC, 0xAB, 0x16, 0x72, 0x8D, 0xAD,
  0xAD, 0xAE, 0x11, 0x11, 0x8E, 0x8E, 0x10, 0x10, 0x31, 0x31, 0x8F, 0x8F, 0x10, 0x8F,
  0x8E, 0x8F, 0x10, 0x8E, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x11, 0x8E, 0x12,
  0xAE, 0x8D, 0x8D, 0x11, 0xAE, 0x11, 0x8E, 0x8D, 0x89, 0x11, 0xAE, 0xAE, 0xAD, 0x10,
  0x11, 0x9C, 0x15, 0x31, 0x40, 0x13, 0x9C, 0x8E, 0xAE, 0xAC, 0xAD, 0x01, 0x11, 0x20,
  0x02, 0x13, 0xAD, 0x8C, 0x15, 0x8D, 0xAE, 0x8D, 0xAE, 0x10, 0x10, 0x11, 0x8F, 0x8F,
  0x8E, 0x11, 0x11, 0x8F, 0x8E, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x10,
  0x8E, 0x11, 0x11, 0x8F, 0x8F, 0x8F, 0x10, 0x12, 0x8D, 0x8D, 0x8D, 0x11, 0xAE, 0x8F,
  0x60, 0x8D, 0x02, 0x01, 0x01, 0x20, 0x02, 0x11, 0x11, 0x73, 0x17, 0x40, 0x40, 0x74,
  0x14, 0x12, 0x11, 0x8D, 0x02, 0x01, 0x20, 0x02, 0x21, 0x11, 0x11, 0x8C, 0xAD, 0xAC,
  0x14, 0x72, 0x13, 0x8E, 0x10, 0x10, 0x8F, 0x8E, 0x8F, 0x8E, 0x10, 0x8E, 0x8E, 0x8F,
  0x8F, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x10,
  0x8E, 0x12, 0xAE, 0x8E, 0x11, 0x8D, 0x13, 0xAE, 0x8E, 0xAE, 0x02, 0x01, 0x20, 0x02,
  0xDE, 0x11, 0xAE, 0x12, 0x13, 0x31, 0x31, 0x73, 0x14, 0x12, 0x71, 0x10, 0xAE, 0x02,
  0x02, 0x21, 0x11, 0x11, 0x11, 0xAD, 0xAC, 0xAC, 0x14, 0x11, 0xAE, 0x10, 0x10, 0x8E,
  0x8E, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x10,
  0x8F, 0x8E, 0x8E, 0x8E, 0x11, 0x8E, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x11, 0x8D,
  0x13, 0xAE, 0x8E, 0x10, 0x11, 0x02, 0x02, 0xDE, 0x11, 0x11, 0xAE, 0x13, 0x13, 0x40,
  0x31, 0x73, 0x73, 0x12, 0x71, 0x8F, 0x8E, 0x10, 0x8F, 0x11, 0x71, 0x10, 0x11, 0xAC,
  0x8B, 0xAC, 0x8C, 0x8D, 0xAE, 0xAE, 0x8F, 0x10, 0x10, 0x8E, 0x8E, 0x8E, 0x10, 0x8F,
  0x8F, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x11, 0x11, 0x8F, 0x11, 0x10,
  0x8E, 0x10, 0x8E, 0x12, 0x14, 0x13, 0x14, 0x8D, 0xAE, 0x10, 0x10, 0x11, 0x8F, 0x8F,
  0x10, 0x11, 0x33, 0x8D, 0x8D, 0x12, 0x17, 0x40, 0x70, 0x73, 0xAC, 0x13, 0x12, 0x11,
  0x8E, 0x8F, 0x8F, 0x13, 0x12, 0x11, 0x11, 0x13, 0xAC, 0xAC, 0x8C, 0x72, 0x8D, 0x11,
  0x10, 0x8F, 0x8F, 0x10, 0x8F, 0x10, 0x11, 0x8F, 0x8F, 0x31, 0x8F, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x8F, 0x11, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x12, 0x14, 0x14,
  0xAC, 0x15, 0x8D, 0xAE, 0x10, 0x10, 0x8F, 0x8F, 0x40, 0x41, 0x8D, 0x11, 0xAE, 0x12,
  0x9A, 0x40, 0x31, 0x17, 0x72, 0x12, 0x10, 0x10, 0x11, 0x11, 0x10, 0x12, 0x13, 0x11,
  0x8D, 0x8C, 0x14, 0xAC, 0x14, 0x14, 0x8D, 0x8E, 0x8F, 0x8F, 0x8F, 0x8F, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x8E, 0x10, 0x8E, 0x10, 0x8F, 0x8F, 0x10, 0x8F, 0x10, 0x8F, 0x8E,
  0x8E, 0x8E, 0x8E, 0x8E, 0x10, 0x12, 0x14, 0x14, 0xAC, 0xAD, 0x13, 0x11, 0x11, 0x8F,
  0x10, 0x13, 0x72, 0x11, 0x8D, 0x10, 0xAE, 0xAD, 0x16, 0x31, 0xBF, 0x75, 0x13, 0x11,
  0x11, 0x10, 0x10, 0x10, 0x10, 0x8D, 0x8D, 0xAE, 0x8D, 0x8C, 0xAD, 0xAC, 0x14, 0x13,
  0x8D, 0x8E, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x8E, 0x8F, 0x10, 0x8E,
  0x10, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E,
  0x14, 0x14, 0x8C, 0x8B, 0x8B, 0x11, 0xAE, 0x10, 0x11, 0x10, 0x11, 0x8D, 0x8D, 0x11,
  0x11, 0x8D, 0x14, 0x31, 0x70, 0xAC, 0x15, 0xAE, 0xAD, 0x11, 0x11, 0x11, 0x11, 0x8D,
  0xAE, 0xAE, 0xAE, 0x8C, 0xAD, 0xAC, 0x14, 0x13, 0x8D, 0x8E, 0x8E, 0x8E, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x8E, 0x8E, 0x10, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F,
  0x31, 0x10, 0x8F, 0x8F, 0x10, 0x8F, 0x10, 0x12, 0x13, 0x14, 0x8C, 0x8D, 0x13, 0x8D,
  0xAE, 0x11, 0x8E, 0x8D, 0x11, 0xAD, 0x8D, 0x11, 0xAE, 0xAD, 0x14, 0x40, 0x31, 0xAC,
  0x9C, 0x14, 0xAE, 0x8F, 0x10, 0x11, 0x8D, 0x11, 0x11, 0x8D, 0xAE, 0x8C, 0x13, 0xAC,
  0x13, 0x8D, 0x8D, 0x8E, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x10,
  0x10, 0x8E, 0x11, 0x8F, 0x10, 0x8E, 0x8F, 0x11, 0x8F, 0x10, 0x8F, 0x8F, 0x8F, 0x10,
  0x10, 0x8E, 0x11, 0xAE, 0x8C, 0x8D, 0x13, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x8D,
  0xAD, 0x11, 0x8D, 0xAD, 0xAD, 0x31, 0x31, 0x16, 0x8B, 0x8D, 0x11, 0x8D, 0x8D, 0x8E,
  0x11, 0xAE, 0xAD, 0x11, 0xAE, 0x8C, 0xAD, 0xAC, 0x8D, 0x8D, 0x8D, 0x11, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x11, 0x8E, 0x11, 0x8E, 0x10,
  0x8F, 0x10, 0x11, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x10, 0x8D, 0x8C, 0x8D, 0x8C, 0x9C,
  0x13, 0xAE, 0xAE, 0x11, 0xAE, 0xAE, 0x11, 0xAE, 0xAD, 0x11, 0x8C, 0x9C, 0x14, 0x31,
  0x31, 0x75, 0xAD, 0x13, 0xAD, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0xAE, 0xAE, 0x8D, 0x14,
  0x15, 0x8D, 0x8C, 0x8D, 0x8D, 0x10, 0x10, 0x10, 0x10, 0x11, 0x10, 0x8F, 0x10, 0x10,
  0x10, 0x8F, 0x8F, 0x8F, 0x10, 0x10, 0x8E, 0x8E, 0x10, 0x10, 0x11, 0x10, 0x11, 0x11,
  0x11, 0x11, 0x10, 0x11, 0xAE, 0x8C, 0x8D, 0x9C, 0xAD, 0x8D, 0x8E, 0xAE, 0x11, 0xAD,
  0xAD, 0xAD, 0xAD, 0xAD, 0x14, 0xAD, 0x9A, 0x31, 0x70, 0x75, 0x14, 0x13, 0xAD, 0x8D,
  0x8D, 0x8D, 0xAE, 0xAE, 0xAE, 0x8D, 0x8D, 0x8C, 0x8B, 0x8C, 0x8D, 0xAE, 0x11, 0x10,
  0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x10,
  0x10, 0x8E, 0x10, 0x10, 0x8F, 0x8F, 0x11, 0x10, 0x8E, 0x10, 0xAE, 0x11, 0x8D, 0x8D,
  0x8D, 0xAD, 0x13, 0xAE, 0x11, 0x11, 0x8D, 0x12, 0xAE, 0xAE, 0x8D, 0x12, 0x8C, 0x15,
  0x9A, 0x70, 0x31, 0x17, 0x14, 0x13, 0xAE, 0x8D, 0x8D, 0x8D, 0xAE, 0xAE, 0xAE, 0x8D,
  0xAE, 0xAD, 0xAD, 0xAD, 0xAE, 0xAE, 0xAE, 0x8E, 0x10, 0x10, 0x10, 0x12, 0x12, 0x8E,
  0x10, 0x10, 0x10, 0x10, 0x8F, 0x70, 0x10, 0x8F, 0x8F, 0x10, 0x11, 0x8F, 0x8F, 0x8E,
  0x11, 0x11, 0x12, 0x13, 0x10, 0x11, 0xAE, 0xAE, 0x8D, 0x8D, 0xAD, 0x8D, 0x11, 0x8D,
  0x8D, 0xAE, 0xAE, 0x8D, 0x8D, 0xAE, 0x14, 0x14, 0x9A, 0x31, 0x31, 0x17, 0x14, 0x13,
  0xAE, 0x8D, 0x8D, 0x13, 0x12, 0x13, 0x13, 0x11, 0x8D, 0xAD, 0xAD, 0x8D, 0xAE, 0x11,
  0xAE, 0x8E, 0x10, 0x11, 0x11, 0x11, 0x10, 0x8E, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x8F,
  0x10, 0x8F, 0x8F, 0x8F, 0x10, 0x31, 0x8F, 0x10, 0x11, 0x10, 0x11, 0x10, 0xAE, 0xAD,
  0xAE, 0xAE, 0x8D, 0xAC, 0x8B, 0x8D, 0x8D, 0x8D, 0x8D, 0xAE, 0xAE, 0x8D, 0xAE, 0x8D,
  0x14, 0x14, 0x9A, 0x31, 0x31, 0xAA, 0x15, 0x13, 0x8D, 0x8D, 0x8C, 0x8D, 0x8D, 0x13,
  0x13, 0xAD, 0xAD, 0xAC, 0x13, 0x8D, 0xAE, 0xAE, 0xAE, 0x8E, 0x10, 0x8E, 0x8F, 0x10,
  0x11, 0x10, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x8F,
  0x8F, 0x8E, 0x10, 0x11, 0x8F, 0x8E, 0x10, 0xAD, 0x14, 0x14, 0x8D, 0x8D, 0x8B, 0x72,
  0x8D, 0x8D, 0x12, 0x13, 0x13, 0x8D, 0x8D, 0x8D, 0x13, 0xAC, 0x16, 0x8F, 0x70, 0x16,
  0x14, 0x14, 0xAD, 0xAE, 0x8D, 0x8D, 0x8D, 0x11, 0x8D, 0xAE, 0x8D, 0x14, 0x13, 0xAD,
  0x8C, 0x8D, 0xAE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10,
  0x8F, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x8F, 0x10, 0x8F, 0x11,
  0x10, 0x11, 0xAE, 0x14, 0x8D, 0xAD, 0xAD, 0x12, 0x8D, 0x11, 0x12, 0x12, 0xAE, 0xAE,
  0xAE, 0x8D, 0x13, 0xAC, 0xAA, 0x10, 0x10, 0x16, 0x9C, 0xAE, 0xAD, 0x11, 0x11, 0x8D,
  0x8D, 0x11, 0xAE, 0x14, 0xAB, 0xAC, 0x13, 0x14, 0x8C, 0x8C, 0xAE, 0x11, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x8E, 0x10, 0x10, 0x8E, 0x10, 0x11, 0x8E,
  0x10, 0x8E, 0xAE, 0x11, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x11, 0xAE, 0x14, 0x8C, 0x8D,
  0xAD, 0xAE, 0xAE, 0x11, 0x13, 0x8D, 0x12, 0x8D, 0x11, 0x13, 0x8C, 0xAA, 0xAA, 0x8F,
  0x31, 0x14, 0x9C, 0x8C, 0x13, 0x8D, 0x8D, 0x13, 0x11, 0x8D, 0x13, 0x13, 0x8C, 0x8C,
  0x13, 0x14, 0x8D, 0x8D, 0x12, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
  0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x11, 0x11, 0x11, 0x8F,
  0x11, 0x10, 0x10, 0xAE, 0x8C, 0x13, 0x8D, 0x8B, 0x13, 0x8D, 0xAE, 0xAE, 0x13, 0x11,
  0x11, 0x11, 0x11, 0x12, 0x14, 0xAC, 0xAA, 0x8F, 0x31, 0x16, 0x8D, 0x8C, 0x11, 0x8D,
  0xAE, 0xAE, 0x12, 0xAD, 0x13, 0xAD, 0x8C, 0x8C, 0x8B, 0x72, 0x13, 0x13, 0x13, 0x8E,
  0x10, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x10,
  0xAE, 0x8E, 0x8E, 0x10, 0x10, 0x11, 0x11, 0x10, 0x8F, 0x10, 0x11, 0x12, 0x13, 0x8D,
  0x8C, 0x8D, 0x15, 0x8D, 0xAD, 0x8D, 0xAD, 0x8D, 0x8D, 0xAD, 0xAD, 0x13, 0x14, 0x15,
  0x17, 0x70, 0x31, 0x16, 0x9C, 0x8C, 0xAE, 0xAE, 0x8D, 0x13, 0x13, 0xAE, 0x8D, 0x8D,
  0x13, 0x14, 0x14, 0x72, 0x13, 0x13, 0x12, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x10,
  0x8F, 0x10, 0x10, 0x10, 0x8E, 0x8F, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x11, 0x10, 0x10, 0x10, 0x12, 0x13, 0x14, 0x8D, 0xAD, 0x15, 0x8D, 0x8D, 0x11,
  0x13, 0xAD, 0xAD, 0xAD, 0x13, 0x12, 0x14, 0x15, 0x75, 0x8F, 0x31, 0xAA, 0xAD, 0x8C,
  0xAE, 0x11, 0x8D, 0xAE, 0x8E, 0xAE, 0x8D, 0x13, 0x8C, 0xAD, 0x15, 0x8C, 0x8D, 0xAE,
  0xAD, 0x11, 0x11, 0x11, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x8E,
  0x8E, 0x11, 0x11, 0x10, 0x8E, 0x11, 0x10, 0x8E, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x12,
  0x13, 0x8C, 0x8C, 0xAD, 0xAD, 0x8D, 0x11, 0xAE, 0x13, 0x11, 0xAD, 0xAD, 0xAD, 0xAD,
  0x14, 0x14, 0x17, 0x8F, 0x40, 0x16, 0x15, 0xAE, 0x12, 0x12, 0x11, 0x11, 0x8D, 0x11,
  0xAE, 0x8D, 0x8C, 0x12, 0x14, 0x13, 0xAD, 0xAE, 0xAE, 0x8E, 0x8F, 0x10, 0x11, 0x8E,
  0x8E, 0x10, 0x8F, 0x8E, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x8E, 0x10, 0x11,
  0x11, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x12, 0x14, 0xAE, 0x8C, 0xAD, 0xAD, 0x8D,
  0x8D, 0xAE, 0xAE, 0x8D, 0xAD, 0xAD, 0x8D, 0x8D, 0x8C, 0x14, 0x16, 0x10, 0x40, 0xAA,
  0xAC, 0x13, 0x11, 0x11, 0xAE, 0x11, 0x13, 0x13, 0x12, 0x12, 0x13, 0x14, 0x8B, 0x8D,
  0x13, 0xAE, 0x8D, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x8F,
  0x10, 0x10, 0x8E, 0x8E, 0x8F, 0x8F, 0x10, 0x12, 0x12, 0x8E, 0x10, 0x8F, 0x10, 0x8E,
  0x10, 0x11, 0x8D, 0xAE, 0x8C, 0x8B, 0x8B, 0xAE, 0x8D, 0xAE, 0xAE, 0x8D, 0xAD, 0xAD,
  0x13, 0x8D, 0x13, 0x14, 0x17, 0x31, 0x31, 0x9A, 0x16, 0xAE, 0x11, 0xAE, 0xAE, 0x11,
  0x8C, 0x8D, 0x12, 0x11, 0xAE, 0x8B, 0x8B, 0x8D, 0x8D, 0xAE, 0xAE, 0x8E, 0x10, 0x10,
  0x10, 0x8E, 0x10, 0x8F, 0x8E, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x8E, 0x11,
  0x11, 0x11, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x11, 0xAE, 0x14, 0x8D, 0x8D,
  0x8B, 0x8D, 0x8D, 0x8D, 0x8C, 0x14, 0xAD, 0xAE, 0xAD, 0xAD, 0x72, 0x16, 0x17, 0x70,
  0xAE, 0x8D, 0x10, 0xAE, 0x13, 0x8D, 0x8D, 0x8C, 0x8D, 0x11, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x11, 0x13, 0x14, 0x13, 0x12, 0x12,
  0x13, 0x13, 0x15, 0x72, 0x11, 0x12, 0x11, 0x11, 0x13, 0xAE, 0x8D, 0xAD, 0x8D, 0x11,
  0x10, 0x8E, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x11, 0x14,
  0x14, 0x72, 0x12, 0x12, 0x13, 0x13, 0x14, 0x13, 0x13, 0x9C, 0x8D, 0xAE, 0x8D, 0x13,
  0x8D, 0x9C, 0x8D, 0x11, 0x10, 0x8E, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x10,
  0x8F, 0x8F, 0x11, 0x13, 0x14, 0x14, 0x13, 0x12, 0x12, 0x13, 0x13, 0x8D, 0x13, 0x8B,
  0x8D, 0x8D, 0x12, 0x8D, 0x13, 0x13, 0xAE, 0x11, 0x10, 0x10, 0x8F, 0x8F, 0x10, 0x10,
  0x10, 0x10, 0x11, 0x8E, 0x10, 0x10, 0x11, 0x14, 0x14, 0x14, 0x12, 0x12, 0x12, 0xAE,
  0xAD, 0x12, 0x12, 0xAD, 0x13, 0x12, 0xAE, 0xAE, 0xAD, 0x13, 0xAE, 0x11, 0x10, 0x10,
  0x8F, 0x10, 0x10, 0x8E, 0x8E, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x11, 0x13, 0x15, 0x14,
  0x13, 0x8D, 0x13, 0x8D, 0x8C, 0x12, 0x12, 0x8D, 0x8D, 0x8D, 0x13, 0x8D, 0xAD, 0x13,
  0x12, 0x11, 0x10, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11,
  0xAE, 0xAD, 0xAD, 0x13, 0x12, 0x12, 0x12, 0x12, 0x14, 0x13, 0x12, 0x8D, 0x8D, 0xAE,
  0x12, 0x8D, 0x72, 0xAB, 0x14, 0x11, 0x8F, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x11, 0x11, 0x12, 0x12, 0x8D, 0x8D, 0x14, 0x12, 0x12, 0x12, 0x8D, 0xAD, 0x12,
  0xAE, 0x8D, 0x8D, 0x12, 0xAE, 0xAE, 0xAD, 0x15, 0x8D, 0x11, 0x10, 0x10, 0x10, 0x10,
  0x8F, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x12, 0x8D, 0x8C, 0x13, 0x12, 0xAE,
  0xAE, 0x11, 0x8D, 0x13, 0x13, 0x9C, 0x12, 0xAE, 0xAE, 0xAE, 0x8D, 0x13, 0x8D, 0x11,
  0x10, 0x10, 0x11, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x11, 0xAE, 0x8E, 0x10, 0x11, 0x13,
  0x8C, 0x8C, 0xAD, 0x8D, 0x8D, 0xAE, 0xAD, 0x13, 0x13, 0x9C, 0x13, 0x13, 0x11, 0xAE,
  0xAD, 0xAD, 0x8D, 0xAE, 0x11, 0x11, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x11, 0xAE,
  0x11, 0x11, 0xAE, 0x8C, 0xAD, 0x8C, 0x12, 0x13, 0xAD, 0xAD, 0x8B, 0x8C, 0x14, 0x14,
  0x12, 0x13, 0xAE, 0x11, 0x14, 0xAD, 0x8D, 0xAE, 0x10, 0x11, 0x11, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x11, 0x11, 0x10, 0x8E, 0x11, 0x8D, 0x8C, 0x13, 0xAE, 0xAD, 0xAC, 0x14,
  0xAC, 0x14, 0x9C, 0x9C, 0x12, 0x76, 0x14, 0xAE, 0x8D, 0x14, 0x13, 0xAE, 0x11, 0x11,
  0x8E, 0x8E, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x8E, 0x10, 0x11, 0x8D, 0x8C, 0x8C,
  0x12, 0x76, 0x8B, 0x13, 0x14, 0x13, 0x13, 0x14, 0xAD, 0xAD, 0x01, 0xAE, 0x12, 0x14,
  0x8D, 0xAE, 0x8E, 0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x8E, 0x10,
  0xAE, 0x14, 0xAD, 0x8C, 0x11, 0xAE, 0x01, 0xAE, 0x15, 0x13, 0x14, 0x15, 0x12, 0xAE,
  0x21, 0x11, 0x13, 0x8C, 0x8D, 0xAE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x8E, 0x11,
  0x10, 0x10, 0x11, 0x10, 0x11, 0x13, 0x14, 0xAD, 0x11, 0xAE, 0x8D, 0xAD, 0xAC, 0x72,
  0x73, 0x15, 0x13, 0x8D, 0xAE, 0x11, 0x8D, 0x8C, 0x8D, 0xAE, 0x10, 0x10, 0x11, 0x11,
  0x10, 0x10, 0x10, 0x11, 0x10, 0x10, 0x11, 0x10, 0xAE, 0x14, 0x8C, 0x8C, 0x8D, 0x8D,
  0xAE, 0x13, 0x16, 0x14, 0x72, 0x15, 0x13, 0xAE, 0x8D, 0xAE, 0xAE, 0x13, 0x8D, 0xAE,
  0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x10, 0x11, 0xAE, 0x13,
  0x8C, 0x8D, 0x8D, 0x13, 0x8D, 0x12, 0x15, 0x13, 0x12, 0x13, 0x8D, 0xAE, 0x13, 0xAE,
  0x8D, 0x14, 0xAE, 0x12, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x11,
  0x10, 0x10, 0x11, 0x8C, 0x8D, 0x12, 0xAE, 0xAE, 0x13, 0x13, 0x14, 0xAD, 0x13, 0x13,
  0x12, 0x12, 0x13, 0x12, 0xAE, 0xAE, 0xAE, 0x11, 0x10, 0x10, 0x11, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0xAE, 0x8D, 0x8D, 0x8D, 0x11, 0x8D, 0x8D, 0xAD,
  0xAC, 0x8D, 0x13, 0xAC, 0x8D, 0xAD, 0x8C, 0x8D, 0x8C, 0x8B, 0x13, 0xAE, 0x11, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x8E, 0x10, 0x11, 0x11, 0x8C, 0x8D, 0xAD,
  0xAE, 0xAE, 0x8D, 0x8D, 0xAC, 0x8C, 0x12, 0xAD, 0x8D, 0x75, 0xAD, 0x8D, 0xAD, 0x14,
  0x8D, 0x8D, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x11,
  0x11, 0x8D, 0x14, 0xAD, 0xAE, 0x74, 0xAD, 0x14, 0xAC, 0x8C, 0x13, 0x13, 0x8D, 0x21,
  0x01, 0xAE, 0x13, 0xAD, 0x13, 0xAE, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10,
  0x10, 0x8E, 0x11, 0x11, 0xAE, 0x13, 0x9C, 0x8C, 0x8D, 0xAE, 0x01, 0xAE, 0xAD, 0x14,
  0x13, 0x72, 0xAE, 0xAE, 0xAE, 0x11, 0x8C, 0xAC, 0x8D, 0x11, 0x10, 0x11, 0x8E, 0x10,
  0x10, 0x10, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0xAE, 0x14, 0x9C, 0x8C, 0x33, 0xAE,
  0xAE, 0x11, 0x14, 0x14, 0x13, 0x14, 0xAE, 0x11, 0x11, 0x8D, 0x8C, 0xAC, 0xAD, 0xAE,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x10, 0x10, 0x11, 0x10, 0x11, 0x8D,
  0xAC, 0x9C, 0xAE, 0x11, 0x8D, 0x8D, 0x15, 0x12, 0xAD, 0xAD, 0xAE, 0x11, 0xAE, 0x8D,
  0x8C, 0x14, 0x72, 0xAE, 0x11, 0x10, 0x10, 0x10, 0x8F, 0x8E, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x11, 0x11, 0x13, 0x8B, 0x14, 0xAE, 0x13, 0x8D, 0x8D, 0x14, 0x13, 0x12, 0x8C,
  0x11, 0x11, 0xAE, 0xAE, 0x8C, 0xAC, 0x13, 0xAE, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10,
  0x8F, 0x8F, 0x8E, 0x10, 0x8F, 0x10, 0x11, 0x8D, 0x13, 0x8D, 0x11, 0xAE, 0xAE, 0x11,
  0x14, 0x13, 0x72, 0x13, 0x13, 0x8D, 0x8D, 0xAE, 0x8C, 0x8B, 0x8C, 0xAE, 0x11, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x8F, 0x10, 0x11, 0x11, 0x11, 0x8D, 0x8D, 0x14,
  0xAE, 0x11, 0x11, 0xAE, 0x14, 0xAD, 0x14, 0x72, 0x8D, 0x8D, 0x12, 0xAE, 0x8C, 0x15,
  0x8D, 0xAE, 0x10, 0x10, 0x10, 0x70, 0x8F, 0x11, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x11,
  0x8D, 0x8D, 0xAD, 0x9C, 0x11, 0xAE, 0xAE, 0x13, 0x14, 0x72, 0xAD, 0x14, 0x8D, 0x8D,
  0x8D, 0x8D, 0x14, 0xAD, 0x8C, 0x11, 0x10, 0x10, 0x8E, 0x10, 0x8F, 0x10, 0x11, 0x10,
  0x10, 0x11, 0x10, 0x10, 0x11, 0x13, 0x8D, 0xAD, 0x13, 0x8D, 0x12, 0x13, 0xAC, 0x14,
  0x12, 0x8C, 0x8D, 0x8D, 0xAE, 0x13, 0x14, 0x72, 0x8D, 0x11, 0x10, 0x10, 0x10, 0x10,
  0x11, 0x11, 0x10, 0x8F, 0x10, 0x11, 0x11, 0x10, 0x11, 0x13, 0x14, 0x72, 0x12, 0x13,
  0x72, 0x13, 0x14, 0x12, 0x13, 0x8C, 0xAE, 0x8D, 0x13, 0x13, 0x13, 0x14, 0x13, 0xAE,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x10, 0x11, 0x13,
  0x14, 0x13, 0xAE, 0x12, 0x13, 0x13, 0x15, 0x13, 0xAD, 0xAD, 0xAE, 0xAE, 0xAE, 0x8D,
  0x8D, 0x14, 0x8D, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x11,
  0x10, 0x10, 0x11, 0x14, 0xAD, 0x13, 0x12, 0x12, 0x13, 0x13, 0x14, 0x8C, 0x8C, 0x14,
  0x11, 0xAE, 0x13, 0x12, 0x13, 0x8C, 0x8D, 0xAE, 0x10, 0x11, 0x10, 0x10, 0x10, 0x8E,
  0x8E, 0x10, 0x10, 0x11, 0x10, 0x10, 0x11, 0x14, 0x8D, 0xAD, 0x12, 0x12, 0x13, 0x13,
  0x14, 0x13, 0xAE, 0x8D, 0x10, 0xAE, 0x12, 0xAE, 0x8D, 0x8C, 0x8D, 0x11, 0x10, 0x10,
  0x10, 0x11, 0x10, 0x10, 0x10, 0x10, 0x11, 0x8E, 0x8E, 0x10, 0x11, 0x13, 0x13, 0x14,
  0x13, 0xAE, 0xAE, 0x13, 0x14, 0x12, 0x11, 0xAE, 0x11, 0xAE, 0xAD, 0x8D, 0x8C, 0x9C,
  0x8D, 0x11, 0x10, 0x11, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x10, 0x11,
  0x11, 0x13, 0x14, 0x14, 0x13, 0xAE, 0x8D, 0x13, 0x15, 0x13, 0x13, 0x8C, 0xAE, 0x12,
  0x13, 0x14, 0x13, 0x9C, 0x8D, 0x11, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x8E, 0x11, 0x11, 0x13, 0xAD, 0x14, 0x12, 0x8D, 0x8D, 0x13, 0x14, 0x8C,
  0x13, 0x8C, 0xAE, 0x8D, 0x13, 0x8C, 0x12, 0x8D, 0xAE, 0x11, 0x10, 0x10, 0x10, 0x8F,
  0x10, 0x10, 0x8F, 0x10, 0x10, 0x11, 0x11, 0x11, 0x13, 0x14, 0xAD, 0x14, 0x12, 0x13,
  0x13, 0x13, 0x14, 0x13, 0x12, 0xAD, 0x12, 0x12, 0xAE, 0x8D, 0x8D, 0xAD, 0x8D, 0x11,
  0x10, 0x11, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x11, 0x8E, 0x10, 0x11, 0x10, 0xAE, 0xAD,
  0x14, 0xAD, 0xAE, 0x11, 0x8D, 0x8D, 0x9C, 0x8C, 0x12, 0x8D, 0xAE, 0x8D, 0x13, 0xAE,
  0x13, 0x14, 0x8D, 0x11, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x11, 0x10, 0x11,
  0x10, 0x10, 0x11, 0x14, 0x9C, 0x13, 0xAE, 0xAE, 0x8D, 0x8D, 0x14, 0x13, 0x12, 0x13,
  0xAE, 0xAE, 0x12, 0x8D, 0x13, 0x14, 0x8D, 0x11, 0x8F, 0x10, 0x10, 0x8E, 0x10, 0x10,
  0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x11, 0x14, 0x14, 0x8C, 0x11, 0x11, 0xAE, 0x8D,
  0xAD, 0x12, 0xAE, 0x8D, 0x11, 0x12, 0xAE, 0x11, 0x12, 0x14, 0x8D, 0x11, 0x10, 0x8F,
  0x10, 0x10, 0x10, 0x10, 0x11, 0x8E, 0x11, 0x8E, 0x8E, 0x10, 0xAE, 0x13, 0x15, 0x8C,
  0x8D, 0xAE, 0xAE, 0x8D, 0xAD, 0x13, 0x12, 0x8C, 0x12, 0xAE, 0xAE, 0x11, 0xAE, 0x13,
  0x8D, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x10,
  0x11, 0x13, 0x8C, 0x9C, 0x8D, 0x13, 0x11, 0xAE, 0xAD, 0x12, 0x13, 0x8C, 0x12, 0x13,
  0xAE, 0xAE, 0x12, 0x8C, 0x8D, 0x11, 0x8F, 0x10, 0x10, 0x11, 0x10, 0x8E, 0x10, 0x10,
  0x11, 0x8E, 0x10, 0x10, 0xAE, 0x8C, 0xAD, 0x8C, 0xAE, 0x13, 0x12, 0x8D, 0x14, 0x8D,
  0x13, 0x13, 0x12, 0x15, 0x9C, 0x12, 0x12, 0x13, 0x8D, 0x11, 0x8F, 0x10, 0x10, 0x11,
  0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x8D, 0x8C, 0x13, 0xAE, 0x15,
  0x14, 0x13, 0xAD, 0x13, 0x8D, 0x8D, 0x13, 0x75, 0xAD, 0xAD, 0x13, 0x9C, 0xAE, 0x11,
  0x10, 0x10, 0x11, 0x10, 0x10, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x8E, 0xAE, 0x8D,
  0x8D, 0x12, 0x14, 0x77, 0xAD, 0x12, 0x13, 0x8D, 0x11, 0xAE, 0x12, 0x8D, 0x01, 0xAE,
  0x12, 0xAD, 0x8D, 0x11, 0x10, 0x11, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x11,
  0x8E, 0x11, 0x8D, 0x13, 0x13, 0x12, 0x12, 0xAD, 0x01, 0xAE, 0x13, 0x12, 0x12, 0x8D,
  0x11, 0x12, 0xAE, 0x71, 0x13, 0xAD, 0x13, 0xAE, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10,
  0x11, 0x11, 0x10, 0x10, 0x11, 0x10, 0x11, 0x13, 0x14, 0x13, 0xAE, 0x12, 0xAE, 0x11,
  0x13, 0x12, 0x14, 0x13, 0xAE, 0xAE, 0x8D, 0x8D, 0xAD, 0x8D, 0x12, 0xAE, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0xAD, 0x14, 0xAD,
  0x8D, 0x13, 0xAD, 0x13, 0x13, 0x12, 0x12, 0x8C, 0xAE, 0x11, 0x11, 0x12, 0x13, 0x14,
  0x13, 0x11, 0x10, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10,
  0x11, 0x8D, 0x13, 0xAD, 0x12, 0xAE, 0xAE, 0x8D, 0x13, 0x12, 0x13, 0x13, 0xAE, 0xAE,
  0x11, 0xAE, 0x8D, 0xAD, 0x8D, 0xAE, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x11, 0x11, 0x11,
  0x10, 0x11, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x8D, 0x12, 0x12, 0x8D, 0x8D, 0x12,
  0x13, 0x13, 0x12, 0x8D, 0xAE, 0x13, 0x13, 0x8C, 0x8C, 0x8D, 0x10, 0x10, 0x8E, 0x10,
  0x8F, 0x10, 0x11, 0x10, 0x11, 0x8E, 0x10, 0x10, 0x11, 0x13, 0x8C, 0x13, 0xAE, 0xAE,
  0xAE, 0x8D, 0xAD, 0x12, 0x12, 0x13, 0xAE, 0xAE, 0x8D, 0x8D, 0x8C, 0x9C, 0x13, 0x12,
  0x10, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x8D,
  0xAD, 0x8D, 0x11, 0x8D, 0x8D, 0x11, 0x8D, 0x8D, 0x11, 0xAE, 0xAE, 0x74, 0xAD, 0x14,
  0xAC, 0x14, 0x8D, 0x12, 0x10, 0x8E, 0x10, 0x70, 0x8F, 0x10, 0x10, 0x10, 0x8F, 0x10,
  0x10, 0x11, 0x11, 0xAE, 0x8D, 0xAE, 0xAE, 0x75, 0xAD, 0xAE, 0x8D, 0x12, 0x12, 0x13,
  0x8D, 0xAE, 0x01, 0xAE, 0x8D, 0x14, 0x13, 0x11, 0x10, 0x8F, 0x8E, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0xAE, 0xAE, 0xAE, 0xAE, 0x21, 0x01, 0xAE,
  0x12, 0x12, 0x12, 0x13, 0x33, 0xAE, 0xAE, 0x11, 0x13, 0xAC, 0x8D, 0x11, 0x10, 0x10,
  0x8E, 0x10, 0x8F, 0x10, 0x10, 0x8F, 0x10, 0x8E, 0x11, 0x10, 0x11, 0x12, 0x8D, 0xAE,
  0x10, 0x11, 0xAE, 0x11, 0x12, 0x12, 0x13, 0x72, 0x11, 0x8E, 0x11, 0x12, 0x8D, 0xAC,
  0x14, 0xAE, 0x8F, 0x8F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E,
  0x11, 0x14, 0x15, 0xAE, 0x10, 0x11, 0x11, 0xAE, 0x12, 0x8D, 0x13, 0x13, 0xAE, 0x10,
  0xAE, 0xAE, 0x8D, 0x14, 0x72, 0xAE, 0x8E, 0x10, 0x10, 0x10, 0x8F, 0x8E, 0x10, 0x8F,
  0x10, 0x10, 0x10, 0x10, 0x11, 0x14, 0x8C, 0x8D, 0x11, 0x11, 0xAE, 0xAE, 0x8D, 0xAE,
  0x12, 0x9C, 0x11, 0x11, 0xAE, 0xAE, 0x8D, 0x14, 0x8D, 0xAE, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x8F, 0x8F, 0x11, 0x8D, 0x8C, 0x12, 0xAE, 0xAE,
  0xAE, 0x12, 0x8C, 0xAE, 0x14, 0x13, 0x13, 0x8D, 0x8D, 0xAE, 0x13, 0x9C, 0x8D, 0x11,
  0x10, 0x10, 0x10, 0x10, 0x10, 0x8F, 0x10, 0x8E, 0x10, 0x10, 0x11, 0x11, 0x11, 0x8D,
  0x8C, 0x8D, 0x11, 0x12, 0x8D, 0x13, 0x14, 0x8C, 0x13, 0x72, 0x8D, 0x8D, 0x12, 0xAE,
  0x8D, 0xAD, 0xAE, 0x11, 0x10, 0x11, 0x11, 0x10, 0x10, 0x8F, 0x10, 0x8F, 0x10, 0x10,
  0x11, 0xAE, 0xAE, 0xAE, 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8D, 0x14, 0x8D, 0xAD, 0x14,
  0x8D, 0x8D, 0x8D, 0x8D, 0xAD, 0x13, 0x8D, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x8E, 0x10, 0x10, 0x11, 0x72, 0x8D, 0xAD, 0x8D, 0x12, 0x8D, 0x8D,
  0x14, 0x14, 0x12, 0x8C, 0x8D, 0x8D, 0xAE, 0x13, 0x8B, 0x72, 0x8C, 0x11, 0x10, 0x10,
  0x10, 0x10, 0x11, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x10, 0x10, 0x11, 0x13, 0x8C, 0x8D,
  0xAE, 0x12, 0xAE, 0x12, 0xAC, 0x8B, 0x13, 0x8C, 0xAE, 0x8D, 0x13, 0x13, 0xAD, 0x14,
  0x13, 0xAE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10,
  0x11, 0x13, 0x8D, 0x14, 0x8D, 0x13, 0xAD, 0x13, 0x14, 0x14, 0x13, 0xAD, 0xAE, 0xAE,
  0xAE, 0x8D, 0xAD, 0x14, 0x8D, 0xAE, 0x10, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x11,
  0x11, 0x10, 0x10, 0x10, 0x11, 0x13, 0x8C, 0x13, 0xAE, 0xAE, 0xAD, 0x13, 0x14, 0x13,
  0x8C, 0x14, 0x11, 0x11, 0x13, 0x12, 0xAD, 0x8C, 0x8D, 0x11, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x8E, 0x10, 0x11, 0x11, 0x10, 0x10, 0x10, 0x8D, 0x8C, 0x8C, 0x8D, 0x13,
  0xAD, 0x13, 0x14, 0x72, 0xAE, 0x11, 0x8D, 0x13, 0xAE, 0x10, 0x10, 0x10, 0x10, 0x10,
  0x10, 0x12, 0x14, 0x12, 0x13, 0x14, 0xAD, 0x8D, 0x12, 0xAD, 0xAE, 0x10, 0x8F, 0x10,
  0x10, 0x10, 0x10, 0x12, 0x14, 0x13, 0x12, 0x13, 0x12, 0x8D, 0xAE, 0x13, 0xAE, 0x10,
  0x8F, 0x10, 0x8E, 0x10, 0x10, 0x12, 0x14, 0x12, 0x12, 0xAD, 0x12, 0xAE, 0xAE, 0x15,
  0x8D, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x8D, 0xAD, 0x12, 0xAE, 0x13, 0xAD, 0x8D,
  0xAE, 0xAD, 0xAE, 0x11, 0x10, 0x10, 0x10, 0x11, 0x11, 0x8D, 0x8C, 0x13, 0x13, 0xAD,
  0x9C, 0x14, 0x12, 0xAD, 0x8D, 0x11, 0x8E, 0x11, 0x10, 0x11, 0x10, 0xAE, 0x8C, 0x14,
  0x14, 0x14, 0x14, 0x13, 0xAE, 0xAD, 0xAE, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x8D,
  0xAD, 0xAE, 0xAE, 0x14, 0x14, 0x13, 0xAE, 0x8D, 0x8D, 0x10, 0x11, 0x10, 0x11, 0x10,
  0x11, 0x13, 0x8C, 0x8D, 0x12, 0x14, 0x13, 0x12, 0x13, 0x8D, 0xAE, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x10, 0x8D, 0x8D, 0xAE, 0x13, 0x14, 0xAD, 0x9C, 0xAD, 0x14, 0x8D, 0x11,
  0x10, 0x10, 0x8E, 0x10, 0x11, 0xAE, 0xAD, 0x13, 0xAD, 0x8B, 0x13, 0xAE, 0xAE, 0xAD,
  0x8D, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x13, 0x8C, 0xAE, 0xAE, 0x14, 0xAD, 0xAE,
  0xAE, 0xAD, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0xAE, 0x8B, 0xAE, 0x8D, 0xAD,
  0x13, 0x8D, 0xAE, 0x9C, 0x8D, 0x11, 0x10, 0x10, 0x8F, 0x10, 0x10, 0xAE, 0xAD, 0xAE,
  0xAE, 0x72, 0x14, 0x8D, 0x8D, 0xAD, 0x8D, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x8D,
  0xAD, 0xAE, 0x8D, 0x14, 0x13, 0x8D, 0x8D, 0x14, 0x12, 0x10, 0x10, 0x11, 0x10, 0x10,
  0x10, 0x12, 0x72, 0x12, 0x13, 0xAD, 0xAD, 0xAE, 0xAE, 0x13, 0xAE, 0x10, 0x10, 0x10,
  0x8E, 0x11, 0x10, 0x12, 0x13, 0x12, 0x13, 0x14, 0xAE, 0x11, 0x8D, 0x8C, 0xAE, 0x10,
  0x8E, 0x10, 0x10, 0x11, 0x8E, 0xAE, 0x14, 0x12, 0x8D, 0xAD, 0x13, 0xAE, 0x13, 0x13,
  0xAE, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x11, 0x13, 0x14, 0x8D, 0x13, 0x14, 0x12, 0x12,
  0x8D, 0xAD, 0xAE, 0x10, 0x10, 0x10, 0x8E, 0x8E, 0x11, 0x8D, 0xAD, 0xAE, 0x8D, 0x8C,
  0x12, 0xAE, 0xAE, 0x14, 0xAE, 0x10, 0x10, 0x10, 0x11, 0x11, 0x8E, 0x8D, 0x14, 0xAE,
  0xAE, 0x13, 0x13, 0x12, 0xAE, 0x8D, 0xAE, 0x10, 0x11, 0x10, 0x10, 0x8E, 0x10, 0x8D,
  0x8C, 0x8D, 0x12, 0x13, 0x13, 0x14, 0xAD, 0x13, 0xAE, 0x10, 0x8E, 0x11, 0x10, 0x11,
  0x10, 0xAE, 0x8D, 0xAC, 0xAD, 0x13, 0x12, 0x12, 0xAE, 0x13, 0xAE, 0x8E, 0x10, 0x10,
  0x10, 0x10, 0x11, 0x8D, 0x13, 0x8D, 0xAE, 0x13, 0x13, 0xAE, 0xAE, 0xAD, 0xAE, 0x10,
  0x10, 0x10, 0x11, 0x10, 0x10, 0xAE, 0xAD, 0x12, 0x13, 0x12, 0x13, 0xAE, 0xAE, 0x13,
  0x8D, 0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0xAE, 0xAD, 0xAE, 0xAE, 0x13, 0x12, 0x13,
  0xAD, 0x14, 0x13, 0x8E, 0x10, 0x10, 0x10, 0x10, 0x10, 0xAE, 0x8D, 0x13, 0x8D, 0x8D,
  0x12, 0xAE, 0xAE, 0xAD, 0x12, 0x10, 0x10, 0x10, 0x10, 0x8E, 0x10, 0xAE, 0xAE, 0x11,
  0xAE, 0x12, 0x13, 0x11, 0xAE, 0xAD, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12,
  0xAD, 0x11, 0xAE, 0x12, 0x13, 0xAE, 0xAE, 0xAD, 0xAE, 0x10, 0x10, 0x10, 0x8E, 0x10,
  0x10, 0xAE, 0x8D, 0xAE, 0x8D, 0x13, 0x72, 0x8D, 0x8D, 0xAD, 0xAE, 0x10, 0x10, 0x10,
  0x10, 0x10, 0x11, 0x12, 0xAD, 0x8D, 0x8D, 0x14, 0x13, 0x8D, 0x8D, 0x14, 0x12, 0x10,
  0x10, 0x10, 0x10, 0x11, 0x10, 0x12, 0x8C, 0x8D, 0x12, 0x14, 0xAD, 0xAE, 0x12, 0xAD,
  0xAE, 0x10, 0x10, 0x10, 0x8E, 0x11, 0x10, 0xAE, 0x8C, 0x8D, 0xAD, 0x14, 0x8D, 0x13,
  0x11, 0x10, 0x10, 0x11, 0x13, 0x13, 0x12, 0x13, 0x11, 0x10, 0x10, 0xAE, 0x13, 0x13,
  0x14, 0x8D, 0xAE, 0x8E, 0x11, 0x11, 0xAD, 0xAD, 0xAD, 0x8D, 0x11, 0x11, 0x11, 0xAE,
  0x8D, 0xAD, 0x13, 0x13, 0xAE, 0x10, 0x10, 0x11, 0x8D, 0xAD, 0x8D, 0x8D, 0xAE, 0x10,
  0x10, 0x11, 0x13, 0x13, 0x13, 0x13, 0x11, 0x10, 0x10, 0x11, 0x8D, 0x13, 0x8D, 0x13,
  0x11, 0x10, 0x10, 0x11, 0x13, 0x13, 0xAE, 0x13, 0x11, 0x10, 0x10, 0xAE, 0x13, 0x13,
  0x12, 0x13, 0x11, 0x10, 0x11, 0xAE, 0x8D, 0x13, 0x13, 0x13, 0x11, 0x8E, 0x8E, 0x11,
  0xAD, 0x13, 0x12, 0x8D, 0x11, 0x10, 0x10, 0x11, 0x13, 0x12, 0x12, 0xAD, 0xAE, 0x10,
  0x10, 0x11, 0x8D, 0x8D, 0x12, 0x8D, 0x11, 0x10, 0x10, 0x11, 0xAE, 0xAE, 0x13, 0x8D,
  0x11, 0x10, 0x10, 0x11, 0x8D, 0x13, 0x8D, 0x13, 0x11, 0x10, 0x8E, 0x11, 0x8D, 0xAD};

TEST_CASE("Hierarchical ImageFileSystems")
{
  const auto fsTestPath = std::filesystem::current_path() / "fixture/test/fs/";
  const auto [name, fs] =
    GENERATE_REF(values<std::tuple<std::string, std::shared_ptr<FileSystem>>>({
      {"IdPakFileSystem", openFS<IdPakFileSystem>(fsTestPath / "Pak/idpak.pak")},
      {"DkPakFileSystem", openFS<DkPakFileSystem>(fsTestPath / "Pak/dkpak.pak")},
      {"ZipFileSystem", openFS<ZipFileSystem>(fsTestPath / "Zip/zip.zip")},
    }));

  CAPTURE(name);

  SECTION("pathInfo")
  {
    CHECK(fs->pathInfo("pics") == fs::PathInfo::Directory);
    CHECK(fs->pathInfo("PICS") == fs::PathInfo::Directory);
    CHECK(fs->pathInfo("pics/tag1.pcx") == fs::PathInfo::File);
    CHECK(fs->pathInfo("PICS/TAG1.pcX") == fs::PathInfo::File);
    CHECK(fs->pathInfo("does_not_exist") == fs::PathInfo::Unknown);
  }

  SECTION("find")
  {
    CHECK_THAT(
      fs->find("", fs::TraversalMode::Flat),
      MatchesPathsResult({
        "bear.cfg",
        "pics",
        "textures",
        "amnet.cfg",
      }));

    CHECK_THAT(
      fs->find("pics", fs::TraversalMode::Flat),
      MatchesPathsResult({
        "pics/tag2.pcx",
        "pics/tag1.pcx",
      }));

    CHECK_THAT(
      fs->find("", fs::TraversalMode::Recursive),
      MatchesPathsResult({
        "amnet.cfg",
        "textures",
        "textures/e1u3",
        "textures/e1u3/strs1_3.wal",
        "textures/e1u3/stflr1_5.wal",
        "textures/e1u2",
        "textures/e1u2/basic1_7.wal",
        "textures/e1u2/angle1_2.wal",
        "textures/e1u2/angle1_1.wal",
        "textures/e1u1",
        "textures/e1u1/brlava.wal",
        "textures/e1u1/box1_3.wal",
        "pics",
        "pics/tag2.pcx",
        "pics/tag1.pcx",
        "bear.cfg",
      }));

    CHECK_THAT(
      fs->find("", TraversalMode{0}),
      MatchesPathsResult({
        "amnet.cfg",
        "textures",
        "pics",
        "bear.cfg",
      }));

    CHECK_THAT(
      fs->find("", TraversalMode{1}),
      MatchesPathsResult({
        "amnet.cfg",
        "textures",
        "textures/e1u3",
        "textures/e1u2",
        "textures/e1u1",
        "pics",
        "pics/tag2.pcx",
        "pics/tag1.pcx",
        "bear.cfg",
      }));
  }

  SECTION("openFile")
  {
    const auto amnet_cfg = fs->openFile("amnet.cfg") | kdl::value();

    auto reader = amnet_cfg->reader();
    CHECK(reader.readString(reader.size()) == R"(//
// my stuff
//

m_pitch 0.022

bind    CTRL		+attack
bind    SPACE       +moveup 
bind    SHIFT       +movedown
bind    mouse2      +strafe 
bind    mouse3      +forward

name Tokay
hostname AmNet

lookspring 1
v_centerspeed 50000
sensitivity 12


lookstrafe 0

bind enter ""
bind 0 "use bfg10k"
bind mouse1 v30

alias v30 "fov 30; sensitivity 7; bind mouse1 v90"
alias v90 "fov 90; sensitivity 13; bind mouse1 v30"
)");
  }
}

TEST_CASE("Flat ImageFileSystems")
{
  const auto fsTestPath = std::filesystem::current_path() / "fixture/test/fs/";
  const auto [name, fs] =
    GENERATE_REF(values<std::tuple<std::string, std::shared_ptr<FileSystem>>>({
      {"WadFileSystem", openFS<WadFileSystem>(fsTestPath / "Wad/cr8_czg.wad")},
    }));

  CAPTURE(name);

  SECTION("pathInfo")
  {
    CHECK(fs->pathInfo("cr8_czg_1.D") == fs::PathInfo::File);
    CHECK(fs->pathInfo("speedM_1.D") == fs::PathInfo::File);
    CHECK(fs->pathInfo("SpEeDm_1.D") == fs::PathInfo::File);
    CHECK(fs->pathInfo("does_not_exist") == fs::PathInfo::Unknown);
  }

  SECTION("directoryContents")
  {
    const auto traversalMode =
      GENERATE(fs::TraversalMode::Flat, fs::TraversalMode::Recursive);
    CAPTURE(traversalMode);

    CHECK_THAT(
      fs->find("", traversalMode),
      MatchesPathsResult({
        "blowjob_machine.D", "bongs2.D",          "can-o-jam.D",     "cap4can-o-jam.D",
        "coffin1.D",         "coffin2.D",         "cr8_czg_1.D",     "cr8_czg_2.D",
        "cr8_czg_3.D",       "cr8_czg_4.D",       "cr8_czg_5.D",     "crackpipes.D",
        "czg_backhole.D",    "czg_fronthole.D",   "dex_5.D",         "eat_me.D",
        "for_sux-m-ass.D",   "lasthopeofhuman.D", "polished_turd.D", "speedM_1.D",
        "u_get_this.D",
      }));
  }

  SECTION("openFile")
  {
    const auto cr8_czg_3_d = fs->openFile("cr8_czg_3.D") | kdl::value();

    auto reader = cr8_czg_3_d->reader();
    auto contents = std::vector<unsigned char>(reader.size());
    reader.read(contents.data(), reader.size());
    CHECK(contents == cr8_czg_03_contents);
  }
}

TEST_CASE("WadFileSystem")
{
  SECTION("Wad files can be replaced while wad file system exists")
  {
    const auto wadPath =
      std::filesystem::current_path() / "fixture/test/fs/Wad/cr8_czg.wad";
    const auto copyPath =
      std::filesystem::current_path() / "fixture/test/fs/Wad/cr8_czg_2.wad";

    REQUIRE_FALSE(std::filesystem::is_regular_file(copyPath));
    REQUIRE_NOTHROW(std::filesystem::copy(wadPath, copyPath));
    REQUIRE(std::filesystem::is_regular_file(copyPath));

    {
      const auto fs = openFS<WadFileSystem>(copyPath);

      auto errorCode = std::error_code{};
      CHECK(std::filesystem::remove(copyPath, errorCode));
      CHECK(errorCode == std::error_code{});
    }

    if (std::filesystem::is_regular_file(copyPath))
    {
      REQUIRE(std::filesystem::remove(copyPath));
    }
  }
}

} // namespace tb::fs
